Привет, ребята, я новичок в Laravel, может кто-нибудь объяснить мне параметры morphMany
$this->morphMany(Photo::class, 'imageable');
MorphMany отношение имеет следующую сигнатуру функции:
public function morphMany($related, $name, $type = null, $id = null, $localKey = null)
{
//
}
Куда:
$related
(требуется): относится к связанной модели. например: User::class
$name
(требуется: название полиморфного отношения, вроде commentable
$type
(необязательно): настройте {relation}_type
поле для поиска при выполнении запроса.$id
(необязательно): настройте {relation}_id
поле для поиска при выполнении запроса.$localKey
(необязательно): настроить локальный ключ (по умолчанию id
) искать при выполнении запроса.Так, используя пример, показанный в документации Laravel— если вы хотите использовать другую структуру таблицы для comments
Таблица из этого:
posts
id - integer
title - string
body - text
videos
id - integer
title - string
url - string
comments
id - integer
body - text
commentable_id - integer
commentable_type - string
к этому:
posts
id - integer
title - string
body - text
videos
id - integer
title - string
url - string
comments
id - integer
body - text
foo - integer // the index to look
bar - string // the type to match
Вам нужно определить ваши отношения следующим образом:
Post.php
public function comments()
{
return $this->morphMany(Comment::class, 'commentable', 'foo', 'bar');
}
Video.php
public function comments()
{
return $this->morphMany(Comment::class, 'commentable', 'foo', 'bar');
}
Comment.php
public function commentable()
{
return $this->morphTo('commentable');
}
Проверь это другой ответ.
Полиморфные отношения
Структура таблицы
Полиморфные отношения позволяют модели принадлежать более чем одной другой модели в одной ассоциации. Например, представьте, что пользователи вашего приложения могут «комментировать» как посты, так и видео. Используя полиморфные отношения, вы можете использовать одну таблицу комментариев для обоих этих сценариев. Сначала давайте рассмотрим структуру таблицы, необходимую для построения этих отношений:
posts
id - integer
title - string
body - text
videos
id - integer
title - string
url - string
comments
id - integer
body - text
commentable_id - integer
commentable_type - string
Следует отметить два важных столбца: столбцы commentable_id и commentable_type в таблице комментариев. Столбец commentable_id будет содержать значение идентификатора записи или видео, а столбец commentable_type будет содержать имя класса модели-владельца. Столбец commentable_type — это то, как ORM определяет, какой «тип» модели-владельца будет возвращаться при доступе к комментируемому отношению.
Структура модели
Далее, давайте рассмотрим определения модели, необходимые для построения этих отношений:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
/**
* Get all of the owning commentable models.
*/
public function commentable()
{
return $this->morphTo();
}
}
class Post extends Model
{
/**
* Get all of the post's comments.
*/
public function comments()
{
return $this->morphMany('App\Comment', 'commentable');
}
}
class Video extends Model
{
/**
* Get all of the video's comments.
*/
public function comments()
{
return $this->morphMany('App\Comment', 'commentable');
}
}
Получение Полиморфных Отношений
После определения таблицы и моделей базы данных вы можете получить доступ к отношениям через свои модели. Например, чтобы получить доступ ко всем комментариям к сообщению, мы можем использовать динамическое свойство comments:
$post = App\Post::find(1);
foreach ($post->comments as $comment) {
//
}
Вы также можете получить владельца полиморфного отношения из полиморфной модели, обратившись к имени метода, который выполняет вызов morphTo. В нашем случае это комментируемый метод в модели Comment. Итак, мы будем обращаться к этому методу как к динамическому свойству:
$comment = App\Comment::find(1);
$commentable = $comment->commentable;
Комментируемое отношение в модели Comment вернет экземпляр Post или Video, в зависимости от того, какой модели принадлежит комментарий.
Смотрите эту ссылку: полиморфные-отношения:
Вы можете войти так:
+---------+----------------+-------------------+
| user_id | commentable_id | commentable_type |
+---------+----------------+-------------------+
| 1 | 1 | App\Post |
| 1 | 2 | App\Post |
| 1 | 3 | App\Post |
| 1 | 1 | App\Video |
| 1 | 2 | App\Video |
| 1 | 3 | App\Video |
+---------+----------------+-------------------+