我是Laravel的新手,我可以编写简单的口才查询,但不知道如何将该查询转换为口才。任何人都可以提出任何想法,是否可以将其转换为口才,还是我必须编写原始查询?
"Select categories.id, categories.name, Sum(likes.liked) as liked
FROM categories, likes
WHERE likes.material_id IN (SELECT category_material.material_id
FROM category_material
WHERE category_material.category_id = categories.id)
GROUP BY categories.id";
这里是我的模特
class Material extends Model
{
public function categories(){
return $this->belongsToMany(Category::class,'category_material');
}
public function likes(){
return $this->hasMany(Like::class);
}
////////////////////////////////////////////////////////////
class Like extends Model
{
protected $table = 'likes';
public function user(){
return $this->belongsTo(User::class);
}
public function material(){
return $this->belongsTo(Material::class);
}
//////////////////////////////////////////////////////
class Category extends Model
{
public function materials(){
return $this->belongsToMany(Material::class,'category_material');
}
答案 0 :(得分:2)
您可以像这样在likes
模型中定义Category
关系:
public function likes()
{
return $this->belongsToMany(Like::class, 'category_material', 'category_id', 'material_id', 'id', 'material_id');
}
然后使用Eloquent
和has()来混合使用withCount
可以达到的目标,但是,我们将修改sum()
调用传回$catrgories = Category::has('likes')->withCount([
'likes as liked' => function ($query) {
$query->select(DB::raw('SUM(likes.liked)'));
},
])->get();
:
has()
如果您想返回没有喜欢的类别,则可以删除raw
方法,并在$catrgories = Category::withCount([
'likes as liked' => function ($query) {
$query->select(DB::raw('COALESCE(SUM(likes.liked), 0)'));
},
])->get();
查询中引入withCount函数:
$categories = Category::with('materials.likes')->get()->map(function ($item) {
$item->setAttribute('liked', $item->materials->map(function ($item) {
return $item->likes->map->sum('liked')->sum();
})->first());
$item->unsetRelation('materials');
return $item;
});
或者,您可以简单地加载必要的关系,然后使用Eloquent从数据库中检索结果后返回COALESCE()来获取值的事实:
.SaveChanges()
这意味着您不必添加自定义关系。