【发布时间】:2021-01-14 18:13:51
【问题描述】:
我目前正在处理一个活动表,该表具有与之关联的线程和回复记录。当我尝试加入表格时,我得到一个混合匹配和两个记录,它不返回单独的记录,但记录包含线程和回复“正文”字段。我希望有人能看到我想用我提供的代码做什么:
if (request('name')){
$name = request('name');
$user = User::where('name', $name)->firstOrFail();
$activities = \DB::table('activities')
->leftJoin('threads', function($builder) use ($user){
$builder->on('threads.user_id', '=', 'activities.user_id')
->where('activities.user_id', '=', $user->id)
->where('activities.activity_type', '=', 'App\Thread');
})
->leftJoin('replies', function($builder) use ($user){
$builder->on('replies.user_id', '=', 'activities.user_id')
->where('activities.user_id', '=', $user->id)
->where('activities.activity_type', '=', 'App\Reply');
})
->where('replies.body', 'LIKE', '%' . $search . '%')
->orWhere('threads.title', 'LIKE', '%' . $search . '%')
->orWhere('threads.body', 'LIKE', '%' . $search . '%')
->get()->unique('id');
}
我想将线程和回复与所有其他字段分开返回,因为有时在我的实验中它导致用户为空或正文为空,我只是不明白为什么。
有时它会在我创建为 App\Reply 的活动表中返回一个 App\Thread。我承认我对联接的了解有限,所以我想问是否有人可以帮忙!
我这里有这个新查询:
$activities = Activity::with('activity')->whereHas('thread', function ($query) use ($search, $user) {
$query->where('threads.user_id', '=', $user->id)
->where('threads.body', 'LIKE', '%' . $search . '%')
->orWhere('threads.title', 'LIKE', '%' . $search . '%');
})->orWhereHas('reply', function ($query) use ($search, $user) {
$query->where('replies.body', 'LIKE', '%' . $search . '%')
->where('replies.user_id', '=', $user->id);
})->get();
谢谢!
【问题讨论】:
-
嗨@user123,您是否在我的回答中使用模型关系尝试了第二种方式提供者:stackoverflow.com/a/64112322/10573560
-
谢谢我已经尝试过了,它确实有效,但我认为这是一个新问题,当我将用户添加到组合中时,所有模型都交织在一起。