【发布时间】:2015-03-16 15:16:36
【问题描述】:
如果我有一个 laravel 类,比如 Category,它与另一个类有 1:many 的关系,比如 Subcategory,我如何查询 所有 子类别,对 Category 类有限制?
例如,查询 Category 类的标题为“TEST”的所有子类别。
class Category extends Model
{
public function subcategories()
{
return $this->hasMany('App\Subcategory');
}
}
class Subcategory extends Model {
public function category(){
return $this->belongsTo('App\Category');
}
}
我试过eager loading via:
$subcategories = Subcategory::with(['category' => function($query)
{
$query->where('title', '=', 'TEST');
}])->get();
// Returns ALL subcategories, with null where the category doesn't = TEST
我对所有这样做的方法都感兴趣!
编辑 -- 两种解决方案:
$data = Category::whereTitle('TEST')->first()->subcategories
//or equivalently:
$data = Category::whereTitle('TEST')->get()[0]->subcategories;
或在子类别中使用@The Alpha 的解决方案创建动态范围
public function scopeFromCategory($query, $type)
{
return $query->whereHas('Category', function ($q) use ($type)
{
$q->whereTitle($type);
});
}
// So you can later call
$data = Subcategory::FromCategory('TEST')->get();
【问题讨论】:
-
必须是单个查询还是可以多个?此外,如果多个
Category符合您的条件怎么办?您的查询应该返回返回的多个类别的所有子类别,还是只有一个类别匹配? -
真正有效的,1 个或多个查询。理想情况下,这将是一个类似于 Category::find(1)->subcategories 的单个查询,但更像是 Category::findTitle('TEST')->subcategories。或者,我个人只匹配一个类别。