在我的项目中,我有一个多态关系。这种关系如下:
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);
}
提前致谢!
答案 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_type
和commentable_id
列更新为productable_type
和productable_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