Laravel - 查询构建器获取关系

时间:2018-03-20 08:29:32

标签: php laravel laravel-5

在我的项目中,我有一个多态关系。这种关系如下:

Plugins
    id - integer
    composer_package - string

Themes
    id - integer
    composer_package - string

Products
    id - integer
    name - text
    ...
    commentable_id - integer
    commentable_type - string

当我需要显示作为主题的所有产品时,我会执行以下操作:

$themes = DB::table('products')->orderBy('id', 'asc')->where('productable_type', Theme::class)->get();

上面的代码为我提供了productable_type字段填充App/Theme的所有产品的列表,我使用类似@foreach($themes as $theme)的foreach循环显示它们。现在我的问题是。 我需要从属于该产品的主题表中获取composer_package。所以说比如说。我从产品表中获得productable_id为3的产品。我想在主题表中composer_package字段的值为ID为3.当我执行{{ $theme->products->composer_package }}或{ {1}}它给了我错误{{ $theme->composer_package }}导致这种情况的原因是什么?

这是我的产品型号

Undefined property

这是我的主题模型

public function product()
{
    return $this->morphTo();
}


public function order_items()
{
    return $this->hasMany(Orderitems::class);
}

提前致谢!

3 个答案:

答案 0 :(得分:1)

您是否有任何理由使用DB外观来提取数据而非实际模型?

您遇到的一个问题是您的多态关系存储在commentable_id / commentable_type字段中,而您的函数名称是product。 Laravel仅通过单独命名就能发挥其魔力,所以让我们确保产品模型中的列名和多态函数名匹配:

public function commentable()
{
    return $this->morphTo();
}

之后,在控制器中尝试这样的事情:

$themeProducts = Product::where('commentable_type', Theme::class)->get();

这在视图中

@foreach ($themeProducts as $themeProduct)
    {{ $themeProduct->commentable->composer_package }}
@endforeach

答案 1 :(得分:0)

您的桌子有#34;可评论",但您的模型正在寻找"可生产的"。你也错过了一种方法。

产品模型中添加:

public function commentable(){
    return $this->morphTo();
}
主题模型中的

将products()方法修改为:

public function products(){
   return $this->morphMany(Product::class, 'commentable');
}

您还可以将表格中的commentable_typecommentable_id列更新为productable_typeproductable_id,在这种情况下,您需要重命名commentable()上面的产品型号的代码为productable(),以及上述主题模型的代码中的'commentable''productable'

(资料来源:https://laravel.com/docs/5.6/eloquent-relationships#polymorphic-relations

答案 2 :(得分:0)

如上面的答案中所述,与模型建立关系,然后您可以使用帮助程序检索关系。 例如。: Product :: where('commentable_type',Theme :: class) - > with('commentable') - > get();

然后可以直接使用如上所述。 例如:$ themeProduct-> commentable