获得多对多多态的所有关系

时间:2018-04-25 07:56:23

标签: php laravel

我知道多对多关系是可能的。但是,教程指出了每个表都处于单独关系(函数)的方式。

但是,我需要一种方法来创建多对多的多态关系,即使它们来自多个表,我也可以获取它的所有关系。

示例:

Log
->connected_tables (the model relationship)
--> [0] App\User
--> [1] App\User
--> [2] App\Transaction
--> [3] App\Item
--> [4] App\ShippingInformation

数据透视表如下:

$table->increments('id');
$table->integer('entity_id')->unsigned();
$table->string('entity_type');
$table->integer('loggable_id')->unsigned();
$table->string('loggable_type');

然后在我的日志模型中,我试图将其取为:

public function loggable()
{
    return $this->morphToMany('App\????', 'entity', 'activity_log_entity');
}

这是我不知道该放什么的部分。

2 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法。但是我和它一起遇到了一个小问题。

首先,在我的日志表中,我通过我的数据库放置了一个hasMany关系,然后加载了“relatedTables”

public function logs()
{
    return $this->hasMany('App\LogPivot', 'entity_id')->with('relatedTables');
}

然后我为枢轴创建了一个模型并建立了这种关系

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

因此,这将获取日志的所有枢轴,然后每个枢轴将变形为他们所指向的任何东西。

问题是枢轴将是第一个而不是实际的表。我如何“采摘”实际的桌子而不是枢轴?

App\LogPivot {#1251
  id: 2,
  entity_id: 573,
  entity_type: "log",
  loggable_id: 3,
  loggable_type: "user",
  created_at: null,
  updated_at: null,
  related_table: null,
  loggable: App\User {#1259
    id: 3,
    name: "Juan",
  },
},

我想直接在其关系上使用App \ User而不是LogPivot

答案 1 :(得分:0)

通过为数据透视表创建模型,我们可以轻松地检索关系中的所有模型。例如,

这是Laravel Documentation中多对多态关系的示例。

posts
    id - integer
    name - string

videos
    id - integer
    name - string

tags
    id - integer
    name - string

taggables
    tag_id - integer
    taggable_id - integer
    taggable_type - string

我们可以创建模型'App\Post','App\Video','App\Tag'和'App\Taggable'。 要检索具有特定标签ID的所有模型,我们可以使用“'App\Taggable'::where('tag_id',1)->get()”。

为了更加方便,我们可以将以下函数添加到“ App\Tag”模型中。

public function taggables()
{
    return 'App\Taggable'::where('tag_id',$this->id)->get();
}