Объясните красноречивые параметры morphMany

Привет, ребята, я новичок в Laravel, может кто-нибудь объяснить мне параметры morphMany

$this->morphMany(Photo::class, 'imageable');

1

Решение

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');
}

Проверь это другой ответ.

1

Другие решения

Полиморфные отношения

Структура таблицы

Полиморфные отношения позволяют модели принадлежать более чем одной другой модели в одной ассоциации. Например, представьте, что пользователи вашего приложения могут «комментировать» как посты, так и видео. Используя полиморфные отношения, вы можете использовать одну таблицу комментариев для обоих этих сценариев. Сначала давайте рассмотрим структуру таблицы, необходимую для построения этих отношений:

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         |
+---------+----------------+-------------------+
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector