1

根据这个问题,在 Laravel 上使用自定义方法名定义多态关系时,morphTo方法的 name 参数不能按预期工作,我们假设一个简单的多态表结构:

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

所以问题是,方法的名称参数的用例是什么morphTo?以及像上面的示例一样自定义关系名称的正确方法是什么?

4

2 回答 2

1

我猜该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');
    }
于 2020-04-22T21:28:19.517 回答
1

Laravel 7.x文档中添加了解释:

如果您需要为关系指定自定义typeidmorphTo,请始终确保将关系名称(应与方法名称完全匹配)作为第一个参数传递:

/**
 * Get the model that the image belongs to.
 */
public function picturable()
{
    return $this->morphTo(__FUNCTION__, 'imageable_type', 'imageable_id');
}
于 2020-06-28T21:53:27.320 回答