我有三张桌子:
categories
id, title
products
id, name
categories_products
id, category_id, product_id
我还设置了相应的模型和关系(两者都属于另一个的属性)
现在我想让所有产品属于一个类别
Category::where('title','Electronics')->first()->products()->limit(10)->get(['products.name']);
工作正常,但我也想包括每个产品的类别标题:
Category::where('title','Electronics')->first()->products()->limit(10)->get(['products.name','category.title']);
然而它返回:找不到列category.title
我认为这种关系可以解决它。
编辑:模型 - >
类别:
class Category extends Model
{
protected $fillable = array('title');
public function products()
{
return $this->belongsToMany('Product', 'categories_products', 'category_id', 'product_id');
}
}
class Product extends Model
{
protected $fillable = array('name');
public function categories()
{
return $this->belongsToMany('Category', 'categories_products', 'product_id', 'category_id');
}
}
答案 0 :(得分:1)
您收到错误的原因是因为select()
的工作原理与Product::select('id', 'name')
->with(['categories' => function($query) {
return $query->select('id', 'title');
}])
->whereHas('categories', function($query) {
return $query->where('title', 'Electronics');
})
->limit(10)
->get();
类似,因为您正在运行类别查询,然后在没有要引用的类别表后运行产品查询选择。
查看Eager Loading。它将有助于解决很多这类问题。您的查询可以写成:
id
因为我们延迟加载你需要每个模型上的with()
列,所以Laravel知道在运行查询后将关系附加到何处。
上面的categories
方法会急切加载whereHas()
关系,而Category
方法会对当前查询设置关系约束。
<强>更新强>
来自$category = Category::where('title','Electronics')
->with(['products' => function($query) {
return $query->select('id', 'name')->limit(10);
}])
->first(['id', 'title']);
模型的类似查询:
$category->products
然后访问产品:
console.log(this.message);