【问题标题】:OctoberCMS Multiple morphOne Relationship十月CMS 多morphOne 关系
【发布时间】:2017-06-02 05:49:07
【问题描述】:

我有一个多态图像模型 (public $morphTo = ['imageable' => []];) 和一个使用它的 Post 模型。

我希望帖子有 2 o 3 张图片用于非常不同的目的(帖子标题、特色图片和背景图片)

由于 Image 模型处理图像的复杂性以及它在其他几个类(文章、页面等)上的使用,我非常想在这样的帖子上使用它,但每种类型只有一个图像,这就是我使用的原因morphOne。在Post 模特上这样做过:

public $morphOne = [
    'header_image' => [
        Image::class,
        'name' => 'imageable'
    ],
    'featured_image' => [
        Image::class,
        'name' => 'imageable'
    ],
    'background_image' => [
        Image::class,
        'name' => 'imageable'
    ],
];

但恢复图像似乎总是检索图像表中的第一个,即使两者都保存在那里。保存任何替换第一条记录,删除删除第一条记录,等等......

我可以猜到问题所在,可能检索 MorphOne 关系的 ONE 记录会获得第一个匹配 typeid 的 imageable 属性的记录。

问题是:有没有办法让这种结构发挥作用?关系上的参数,也许是不同的变形关系?

感谢您的帮助!

【问题讨论】:

  • 从未尝试过 octobercms(但 - 但几乎没有 laravel 背景)我想知道如果你给它起不同的名字会发生什么,'name' => 'imageable'编辑或者给图像表添加额外的列(如果可能的话),就像in this example一样。
  • 使用关系条件在 10 月实施了几乎相同的解决方案。请参阅下面的答案!
  • 我明白了,这是一种操纵多态关系的有趣方式。

标签: php laravel-5 octobercms


【解决方案1】:

我找到了一种使用多个 morphOne 关系的方法。

您只需要向关系添加范围或条件以及过滤数据的列即可:

public function scopeHeaderImage($query) {
    $query->where('image_type', "header_image");
}

public function scopeFeaturedImage($query) {
    $query->where('image_type', "featured_image");
}

关于关系:

public $morphOne = [
    'header_image' => [
        \NewCriterion\Content\Models\Image::class,
        'name' => 'imageable',
        'scope' => 'headerImage'
    ],
    'featured_image' => [
        \NewCriterion\Content\Models\Image::class,
        'name' => 'imageable',
        'conditions' => "image_type = 'featured_image'"
    ]
];

两种方式都有效,作为作用域(使用顶部的模型方法或直接使用原始 where 条件)

请注意,要使其正常工作,您必须将此信息保存在数据库中。我在$model->beforeFilter() 中实现了它:

$model->header_image->image_type = "header_image";
$model->featured_image->image_type = "featured_image";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2015-02-16
    • 2015-01-07
    • 1970-01-01
    相关资源
    最近更新 更多