在Laravel 5.4中获取多态关系的所有者

时间:2017-05-10 19:21:17

标签: php laravel polymorphism laravel-5.4

所以,我在获取多态关系的所有者时遇到了麻烦。这很简单。正如文档所说的那样。我已经能够取得孩子而不是主人。

这是我的表结构:

histories table structure

库存表的表结构:

Structure for inventory table

历史模型:

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\Relation;

Relation::morphMap([
  'inventory' => 'App\Inventory',
  'customer' => 'App\Customer',
  'supplier' => 'App\Supplier',
]);

class History extends Model
{
  public function product()
  {
    return $this->belongsTo('App\Product');
  }

  public function moveTo()
  {
    return $this->morphTo();
  }
}

这是库存模型:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Inventory extends Model
{
  public function users(){
    return $this->belongsToMany('App\User');
  }

  public function products(){
    return $this->hasMany('App\Product');
  }

  public function histories()
  {
    return $this->morphMany('App\History', 'moveTo');
  }
}

不幸的是,dd($history->moveTo);返回null

的值

但如果我dd($inventory->histories);,那么所有数据都在那里。

任何人都知道为什么?

2 个答案:

答案 0 :(得分:1)

您必须将其包含在关系$this->morphTo('moveTo');以及

public function moveTo()
{
  return $this->morphTo('moveTo');
}

我不确定,但是Laravel Morph Relationship使用able作为后缀,例如commentabletaggable。这样你就不必在上面做了。

这解决了我的问题。希望能帮助到你。 :)

答案 1 :(得分:0)

您正在库存模型中定义morphMap,但需要在服务提供商中定义。您可以构建自己的服务提供者,也可以将其放在AppServiceProvider

的引导方法中
class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Relation::morphMap([
            'inventory' => 'App\Inventory',
            'customer' => 'App\Customer',
            'supplier' => 'App\Supplier',
        ]);
    }
}