【问题标题】:What is the use case of the first argument of the `morphTo` method?`morphTo` 方法的第一个参数的用例是什么?
【发布时间】:2020-08-05 18:31:00
【问题描述】:

根据this issue,在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 方法的名称参数的用例是什么? 以及像上面的示例那样自定义关系名称的正确方法是什么?

【问题讨论】:

  • 您能提供您的PostUser 模型吗?
  • @manzor 这只是 Laravel 文档中的一个示例,您可以在此处找到 PostUser 示例代码:laravel.com/docs/7.x/…

标签: laravel eloquent eloquent-relationship polymorphic-relationship


【解决方案1】:

在 Laravel 7.x documentation 中添加了解释:

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

/**
 * Get the model that the image belongs to.
 */
public function picturable()
{
    return $this->morphTo(__FUNCTION__, 'imageable_type', 'imageable_id');
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 2012-04-29
      • 2015-08-12
      • 2018-01-31
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多