gpt4 book ai didi

Laravel - 检索多对多多态关系的逆(带分页)

转载 作者:行者123 更新时间:2023-12-05 07:50:58 25 4
gpt4 key购买 nike

经过一些挖掘,我仍然找不到任何可靠的方法来检索允许混合模型结果的多对多多态关系的逆。

请考虑以下事项:

我有几个可以“标记”的模型。虽然检索例如 $item->tags$article->tags 以及与 $tag->articles$tag->items 我没有简单的方法来执行类似 $tag->taggables 的操作以返回同一集合中的文章和项目。事情变得更加坎坷,因为我需要对查询使用分页/简单分页。

我已经尝试了一些解决方法,但我能组合起来的最好方法看起来仍然很糟糕且有限。基本上:

  • 我针对每个“可标记”查询了一次数据库;
  • 将所有内容放在一个大集合中;
  • 将集合传递给 phpleague/分形转换器(我的 API 使用它),它根据解析的模型返回不同的 json 值。

这种方法的局限性在于构建分页是一场噩梦,而且分形“包含”选项不能开箱即用。

谁能帮帮我?我目前正在使用 Laravel 5.1。

我当前的代码没有太多魔力。伪造和简化它以使其简短:

来自 api Controller :

$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您会很容易发现嵌套的“包含”模型不会被应用。

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 次单独调用以分三步检索文章、类别和项目的选项。虽然在这种特定情况下这毕竟可能有意义,但我仍然需要用我项目的另一部分来处理这种令人头疼的逆向关系:通知。在这种特殊情况下,通知必须与许多不同的操作/模型相关,我必须分批检索它们(分页)并按模型创建日期排序...

希望这一切都有意义。我想知道对整个逆向“多态”问题采用完全不同的方法是否会有所帮助。

亲切的问候,费德里科

最佳答案

啊是的。不久前我还在你的路上。我有同样的噩梦来处理解决多态关系的逆关系。

不幸的是,多态关系在 Laravel 生态系统中没有得到太多关注。从远处看,它们看起来像 unicorn 和彩虹,但很快您就会遇到这样的事情。

你能发布一个 $thing->taggable 的例子以获得更好的图片吗?认为它可以通过动态特征 + 访问器魔法来解决。

关于Laravel - 检索多对多多态关系的逆(带分页),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35633604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com