You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel带条件查询预约:获取未取消或已取消且含未读消息的预约

实现Laravel Reservation查询需求

你可以通过两种简洁的方式实现这个查询逻辑,核心是正确构建(状态≠已取消) OR (状态=已取消且存在未读消息)的条件:

方法一:使用whereExists子查询

这种方式直接通过数据库子查询验证未读消息的存在性,性能表现较好:

use Illuminate\Support\Facades\DB;

$reservations = Reservation::query()
    // 条件1:状态不为已取消(替换成你实际的状态值,比如'cancelled')
    ->where('status', '!=', '已取消')
    // 条件2:状态为已取消且存在未读消息
    ->orWhere(function ($query) {
        $query->where('status', '=', '已取消')
              ->whereExists(function ($subquery) {
                  $subquery->select(DB::raw(1))
                           ->from('messages')
                           ->whereColumn('messages.reservation_id', 'reservations.id')
                           ->where('messages.read', 0);
              });
    })
    ->get();

方法二:利用已定义的unreadMessages关联(更直观)

借助你已经定义的关联方法,使用withCount统计未读消息数量,再基于计数筛选:

$reservations = Reservation::query()
    // 统计每个Reservation的未读消息数量,字段名为unread_messages_count
    ->withCount('unreadMessages')
    ->where(function ($query) {
        $query->where('status', '!=', '已取消')
              ->orWhere(function ($subQuery) {
                  $subQuery->where('status', '=', '已取消')
                           ->where('unread_messages_count', '>', 0);
              });
    })
    ->get();

注意事项

  • 请将代码中的'已取消'替换为你数据库中实际存储的状态值(比如字符串'cancelled'或对应枚举值)。
  • 如果需要进一步筛选或排序,可以在查询链中添加对应的方法(比如orderBy、select等)。

内容的提问来源于stack exchange,提问作者Parsa Haghighi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:07:06