Laravel将Mysql查询转换为雄辩

时间:2019-07-22 07:10:41

标签: sql laravel eloquent

我是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');
        }

1 个答案:

答案 0 :(得分:2)

您可以像这样在likes模型中定义Category关系:

public function likes()
{
    return $this->belongsToMany(Like::class, 'category_material', 'category_id', 'material_id', 'id', 'material_id');
}

然后使用Eloquenthas()来混合使用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()

这意味着您不必添加自定义关系。