OctoberCMS多个morphOne关系

时间:2017-01-18 00:28:55

标签: php laravel-5 octobercms

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

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

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

上这样做了
public $morphOne = [
    'header_image' => [
        Image::class,
        'name' => 'imageable'
    ],
    'featured_image' => [
        Image::class,
        'name' => 'imageable'
    ],
    'background_image' => [
        Image::class,
        'name' => 'imageable'
    ],
];

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

我可以猜到这个问题,可能是为MorphOne关系检索一条记录,第一条匹配{image}属性的typeid

问题是:有没有办法让这个结构有效?关系上的参数,可能是不同的变形关系?

感谢您的帮助!

1 个答案:

答案 0 :(得分: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'"
    ]
];

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

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

中实现了它
$model->header_image->image_type = "header_image";
$model->featured_image->image_type = "featured_image";