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
相关产品推荐
相关产品推荐

