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

2023-12-22

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

请考虑以下事项:

我有几个可以“标记”的模型。虽然检索例如很简单$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 次单独的调用,以分三步检索文章、类别和项目。虽然在这个特定的场景中这可能是有意义的,但我仍然需要用我的项目的另一部分来处理这个特定的逆关系头痛:通知。在这种特殊情况下,通知必须与许多不同的操作/模型相关,我必须批量检索它们(分页)并按模型创建日期排序...

希望这一切都有道理。我想知道对整个逆“多态”物质采取完全不同的方法是否会有帮助。

亲切的问候, 费德里科


是啊。不久前我就沿着你的道路走下去了。在解决多态关系的逆关系时,我也有同样的噩梦。

不幸的是,多态关系在 Laravel 生态系统中并没有得到太多关注。从远处看,它们看起来像独角兽和彩虹,但很快你就会与这样的东西战斗。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 禁用 web.config 继承?

    我的网站根目录中有一个内容管理应用程序 我尝试在子文件夹下使用另一个应用程序 计费应用程序 不幸的是 根站点的 web config 干扰了子应用程序 有没有办法只禁用子文件夹的 web config 继承 Update 如链接所示史蒂芬
  • 可以从 UIView 复制 CALayer 吗?

    这是我的设置 我有一个 CALayer 我想向其中添加子层 我通过设置 UILabel 创建这些子层 然后将 UILables 层添加到我的主层 当然 这会使沉重的 UILabel 对象在后台徘徊 是否可以从 UIView 获取图层及其所有
  • 在 OData 中,有没有办法按数组中的第一个元素进行排序?

    我有一个 OData 4 端点 用于在表中显示数据 其中一列包含一组由我的元素内的字符串数组连接而成的数据 有没有办法按数组中的第一个元素排序 我的元素可能如下所示 FirstName John MiddleNames Harry Bobb
  • 如何获取 Windows 8 应用程序的方法名称

    如何在 win 8 WinRT 应用程序中获取当前方法名称 早期在 wp7 中我们可以使用System Reflection MethodBase GetCurrentMethod Name但它不再存在了 谢谢 是的 NETCore 缺少很
  • 如何从命令行使用 GIMP 将 XCF 转换为 PNG?

    作为构建过程的一部分 我需要将许多 XCF GIMP 的本机格式 图像转换为 PNG 格式 我确信使用 GIMP 的批处理模式应该可以实现这一点 但我已经忘记了我以前知道的所有 script fu 我的输入图像有多个图层 因此我需要相当于
  • 将数据传递给 subprocess.check_output

    我想调用一个脚本 将字符串的内容通过管道传输到其标准输入并检索其标准输出 我不想接触真正的文件系统 所以我无法为其创建真正的临时文件 using subprocess check output剧本写什么我都能得到 我怎样才能将输入字符串放入
  • 尽可能快地获取大型文本文件中包含字符串的所有行?

    在Powershell中 如何尽可能快地读取和获取巨大文本文件 大约200000行 30 MB 中包含特定字符串的最后一行 或所有行 我在用着 get content myfile txt select string pattern my
  • GWT Requestfactory 性能建议

    我发现使用 GWT requestfactory 时性能非常糟糕 例如 一个请求需要我的服务层 2 秒才能完成 而 GWT 则需要 20 秒才能序列化 我的服务返回约 100 个实体代理 这些对象中的每一个都有 4 个 ValueProxi
  • 如何生成一组随机颜色,其中没有两种颜色几乎相似?

    我目前使用以下函数来生成颜色的随机十六进制表示 function getRandomColor max r 192 max g 192 max b 192 if max r gt 192 max r 192 if max g gt 192
  • 为什么 VS2010 调试器会挂起?

    这种情况刚刚开始发生在我的工作箱和家里 在 Visual Studio 2010 中 我将启动调试会话 程序将运行到第一个断点 仅此而已 我可以随心所欲地按 F10 11 5 什么都不会发生 退出的唯一方法是 Shift F5 这让我发疯
  • 无法设置访客内存“android_arm”:参数无效

    我花了几天时间尝试启动任何 Android 程序 即使 Hello World 也给我同样的错误 2014 10 28 18 07 14 android19 Android Launch 2014 10 28 18 07 14 androi
  • XDocument 中innerXml 和outerXml 的对应项是什么?

    我正在尝试将一些使用 XmlDocument 类的代码重构为 Linq To Xml 但是 我不确定XDocument 中innerXml 和outerXml 的对应项是什么 根据 MSDN InnerXml http msdn micro
  • 根据选择值禁用 Angular Reactive 表单输入

    我有一个表单 使用 Angular Material 我想根据选择值禁用某些输入字段 我的代码如下所示 HTML
  • 如何查看Excel文件的XML形式?

    如何查看 Excel 的 XML 形式 xlsx file XLSX 文件只是 ZIP 文件 因此请使用您最喜欢的 ZIP 工具解压缩它们
  • 如何通过java代码访问和创建azure存储帐户的生命周期规则/生命周期管理策略

    我想创建一个生命周期规则 or 生命周期管理政策对于特定的 azure 存储帐户 通过java代码 不通过 terraform 或 azure 门户 任何适当的代码片段或参考都会有所帮助 提前致谢 如果您想管理 Azure Blob 存储生
  • xcode Storyboard - ibtoold 解档异常

    例外的是 CompileStoryboard Catwall en lproj MainStoryboard storyboard cd Users guvenozyurt Desktop git catwall ios setenv IB
  • 智能卡读卡器访问时出现未知错误 0x16

    我正在尝试更改 ACR1252U 上的蜂鸣器持续时间 API 链接 http www acs com hk download manual 6402 API ACR1252U 1 09 pdf http www acs com hk dow
  • 在 keras 中微调预训练模型

    我想在 keras 中使用预训练的 imagenet VGG16 模型 并在顶部添加我自己的小型卷积网络 我只对功能感兴趣 对预测不感兴趣 from keras preprocessing image import ImageDataGen
  • 一次从流中选取 2 个元素[重复]

    这个问题在这里已经有答案了 假设我们有一个集合 或流 1 2 3 4 现在我们想要取两个元素并像这样组成一对 1 2 2 3 3 4 我们知道如何以丑陋的方式做到这一点 for 循环 我想知道我们如何使用 java 8 流来做到这一点 因为
  • Laravel - 检索多对多多态关系的逆(带分页)

    经过一番挖掘后 我仍然找不到任何可靠的方法来检索允许混合模型结果的多对多多态关系的逆 请考虑以下事项 我有几个可以 标记 的模型 虽然检索例如很简单 item gt tags article gt tags和相反的 tag gt artic