经过一番挖掘后,我仍然找不到任何可靠的方法来检索允许混合模型结果的多对多多态关系的逆。
请考虑以下事项:
我有几个可以“标记”的模型。虽然检索例如很简单$item->tags
, $article->tags
和相反的$tag->articles
and $tag->items
我没有简单的方法来做类似的事情$tag->taggables
返回同一集合中的文章和项目。事情变得更加坎坷,因为我需要使用分页/简单分页来进行查询。
我尝试了一些解决方法,但我能想到的最好的解决方法仍然看起来很糟糕且有限。基本上:
- 我每个“可标记”查询数据库一次;
- 将所有内容放入一个大集合中;
- 将集合传递给 php league/fractal 转换器(我的 API 使用它),该转换器根据解析的模型返回不同的 json 值。
这种方法的局限性在于,构建分页是一场噩梦,而且分形“包含”选项不能开箱即用。
谁能帮我?我目前正在使用 Laravel 5.1。
我当前的代码中没有太多魔力。伪造并简化它以使其简短:
从 API 控制器:
$tag = Tag::findOrDie($tid);
$articles = $tag->cms_articles()->get();
$categories = $tag->cms_categories()->get();
$items = $tag->items()->simplePaginate($itemsperpage);
$taggables = Collection::make($articles)->merge($categories);
// Push items one by one as pagination would dirt the collection struct.
foreach ($items as $item) {
$taggables->push($item);
}
return $this->respondWithCollection($taggables, new TaggableTransformer);
注意:使用 simplePaginate() 只是因为我希望所有文章和类别都显示在首页加载时,而项目数量太多需要分页。
来自 Transformer 类:
public function transform($taggable)
{
switch (get_class($taggable)) {
case 'App\Item':
$transformer = new ItemTransformer;
break;
case 'App\CmsArticle':
$transformer = new CmsArticleTransformer;
break;
case 'App\CmsCategory':
$transformer = new CmsCategoryTransformer;
break;
}
return $transformer->transform($taggable);
}
请考虑其他转换器只是返回与它们相关的模型的数据数组。如果你使用Fractal https://github.com/thephpleague/fractal您会很容易发现嵌套的“包含”模型不会被应用。
Tag 模型没什么特别的:
class Tag extends Model
{
protected $morphClass = 'Tag';
protected $fillable = array('name', 'language_id');
public function cms_articles() {
return $this->morphedByMany('App\CmsArticle', 'taggable');
}
public function cms_categories() {
return $this->morphedByMany('App\CmsCategory', 'taggable');
}
public function items() {
return $this->morphedByMany('App\Item', 'taggable');
}
// Would love something like this to return inverse relation!! :'(
public function taggables() {
return $this->morphTo();
}
}
我还在考虑选择对 API 进行 3 次单独的调用,以分三步检索文章、类别和项目。虽然在这个特定的场景中这可能是有意义的,但我仍然需要用我的项目的另一部分来处理这个特定的逆关系头痛:通知。在这种特殊情况下,通知必须与许多不同的操作/模型相关,我必须批量检索它们(分页)并按模型创建日期排序...
希望这一切都有道理。我想知道对整个逆“多态”物质采取完全不同的方法是否会有帮助。
亲切的问候,
费德里科