Каков вариант использования первого аргумента метода `morphTo`? - PullRequest
0 голосов
/ 22 апреля 2020

Согласно этой проблеме , при использовании имени пользовательского метода для определения отношения полиморф c в Laravel аргумент имени метода morphTo не работает должным образом. Предположим, что простая полиморфная c структура таблицы:

posts
    id - integer
    name - string

users
    id - integer
    name - string

images
    id - integer
    url - string
    imageable_id - integer
    imageable_type - string

и структура этой модели:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Image extends Model
{
    // ...

    // It doesn't work as expected
    public function picturable1()
    {
        return $this->morphTo('imageable');
    }

    // It doesn't work as expected
    public function picturable2()
    {
        return $this->morphTo('imageable', 'imageable_type', 'imageable_id');
    }

    // It works unexpectedly
    public function picturable3()
    {
        return $this->morphTo(null, 'imageable_type', 'imageable_id');
    }
}

При загрузке этих отношений:

$image = \App\Image::with('picturable1')->find(1);
$image->picturable1; // exists and returns null but imageable instance was expected
$image->imageable;   // returns imageable instance unexpectedly

$image = \App\Image::with('picturable2')->find(1);
$image->picturable2; // exists and returns null but imageable instance was expected
$image->imageable;   // returns imageable instance unexpectedly

$image = \App\Image::with('picturable3')->find(1);
$image->picturable3; // returns imageable instance as expected
$image->imageable;   // doesn't exists as expected

Итак, вопросы , Каков вариант использования аргумента name метода morphTo? и как правильно настроить имя отношения, как в примере выше?

1 Ответ

1 голос
/ 23 апреля 2020

Полагаю, параметр name позволяет настроить имя свойства, в котором будет храниться связанная модель. Таким образом, в контроллере вы должны указать имена, которые вы ожидаете иметь как отношения:

    public function picturable1()
    {
        return $this->morphTo('picturable1', 'imageable_type', 'imageable_id');
        // or return $this->morphTo(null, 'imageable_type', 'imageable_id');
    }

    public function picturable2()
    {
        return $this->morphTo('picturable2', 'imageable_type', 'imageable_id');
        // or return $this->morphTo(null, 'imageable_type', 'imageable_id');
    }
...