【问题标题】:Query for returning individual records from related table in a polymorphic relationship从多态关系中的相关表中返回单个记录的查询
【发布时间】: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();

谢谢!

【问题讨论】:

标签: mysql laravel


【解决方案1】:

在尝试将用户包含在查询构建器中后,我只是在 ::with 子句之后添加了用户,并让以下查询工作:

    $activities = Activity::with('activity')->where('user_id', $user->id)->whereHas('thread', function ($query) use ($search, $user) {
        $query->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();

以后可能需要其他帮助的任何人都可以访问此链接:https://zaengle.com/blog/using-wherehas-in-laravel-polymorphic-relations

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多