需要将查询转换为 Eloquent Model laravel

Posted

技术标签:

【中文标题】需要将查询转换为 Eloquent Model laravel【英文标题】:Need to convert a query into Eloquent Model laravel 【发布时间】:2021-07-27 21:11:39 【问题描述】:

我有一个mysql的查询,但我需要将它转换成一个雄辩的模型laravel 8。查询如下,

$query = "SELECT  group_id FROM `chat_histories` join chat_group on chat_group.id = chat_histories.group_id where chat_group.is_group = 1 and chat_histories.created_at BETWEEN '$startDate' and '$endDate' and chat_histories.deleted_at is null group by group_id";
$query = "select count(group_id) as total_chat_thread from ($query) total_chat";
DB::select($query);

到目前为止,我已经做到了,

ChatHistory::leftJoin('chat_group', 'chat_group.id', '=', 'chat_histories.group_id')
        ->selectRaw('count(*) as totals')
        ->where('chat_group.is_group', 1)
        ->whereBetween('chat_histories.created_at', [$startDate, $endDate])
        ->groupBy('chat_histories.group_id')
        ->count('totals');

但这会返回一个列表,但我需要该列表的计数。这意味着它显示了 22 行,我需要这 22 行作为返回。

我的模型 ChatHistory 与 ChatGroup 的关系

 public function chatGroup() 
    return $this->belongsTo(ChatGroup::class, 'group_id', 'id');

我的模型 ChatGroup 与 ChatHistory 的关系

public function chatHistory() 
    return $this->hasMany(ChatHistory::class,'group_id','id');

请帮忙把它转换成一个雄辩的模型查询 提前致谢。

【问题讨论】:

首先添加模型代码,声明关系 请检查问题,我已经编辑了我的问题并添加了我到目前为止所做的事情。 你有没有得到它与下面的答案一起工作? 【参考方案1】:

如果您的模型组具有关系history hasMany。应该是这样的。

$groupCount = ChatGroup::whereHas('chatHistory', function ($historyQB) use($startDate,$endDate)  
    $historyQB->whereBetween('created_at', [$startDate, $endDate])
        ->whereNull('deleted_at');
)->count();

如果模型 ChatHistory 启用了 softDelete,则不需要 whereNull

【讨论】:

ChatHistory::leftJoin('chat_group', 'chat_group.id', '=', 'chat_histories.group_id') ->selectRaw('count(*) as totals') ->where( 'chat_group.is_group', 1) ->whereBetween('chat_histories.created_at', [$startDate, $endDate]) ->groupBy('chat_histories.group_id') ->count('totals');但这会返回一个列表,但我需要该列表的计数。这意味着它显示了 22 行,我需要这 22 行作为返回。 @Md.Ashrafuzzaman 我已经用您添加到问题中的内容编辑了答案,只需按原样运行即可。【参考方案2】:

也许你应该考虑使用模型,它会更容易/更干净

类似的东西应该可以工作

DB::table('chat_histories')->select('group_id')->join('chat_group', 'chat_group.id', 'chat_histories.group_id')->where('chat_groups.is_group', 1)->whereBetween('chat_histories.created_at', $startDate, $endDate)->whereNull('chat_histories.deleted_at')->groupBy('group_id')->count();

【讨论】:

以上是关于需要将查询转换为 Eloquent Model laravel的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据库查询构建器转换为 Eloquent 模型

将 Sql 查询转换为 Eloquent Laravel 5.6

如何将查询生成器转换为 Eloquent 查询?

我想将 SQL 查询转换为 Laravel eloquent

将具有许多连接的复杂 SQL 查询转换为 Eloquent

将 SQL 查询转换为 Laravel Eloquent [关闭]