"LIKE" 查询 table,根据关系类型将外键分配给多个 table

"LIKE" query on table with Foreign Key assigned to multiple tables based upon relationship type

我的问题有三个 table:"comments"、"users" 和 "company_contacts"

"comments" table 有两列:"company_contact (INT)" & "company_contact_kind (String)"

comments.company_contact 根据 comments.company_contact_kind = 'contact'comments.company_contact_kind = 'user'

分配给 users.idcompany_contacts.id

这是我的查询:

$data['comments'] = Comment::join('users', 'comments.creator_id', '=', 'users.id')
        ->join('users AS user_contacts', 'comments.company_contact', '=', 'user_contacts.id')
        ->join('company_contacts', 'company_contacts.id', '=', 'comments.company_contact')
        ->where('comments.commentable_type', $request->type)
        ->where('comments.commentable_id', $request->company_id)
        ->where(function($query) use ($request){
        $query->orWhere('body', 'LIKE', '%' . $request->q . '%')
            ->orWhere('users.first_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('users.last_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('user_contacts.first_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('user_contacts.last_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('company_contacts.first_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('company_contacts.last_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('comments.contact_type', 'LIKE', '%' . $request->q . '%')
            ->orWhere('tags', 'LIKE', '%' . $request->q . '%');
        })
        ->orderBy('comments.created_at', 'DESC')
        ->select('comments.*')
        ->get();

我的问题: 在搜索特定评论联系人时,因为我在查询中同时引用了用户和公司联系人,并且两者都等于 comments.company_contact,如果我搜索 company_contacts.id 的名字或姓氏,它将 return 结果 users.id 作为 comments.company_contact 因为 comments.company_contact 引用了用户和 company_contacts.

有没有办法在查询中设置条件以获得更直观的东西?

已解决:

感谢@cmerriman 提出的答案,我能够调整答案并通过以下查询解决它:

$data['comments'] = Comment::join('users', 'comments.creator_id', '=', 'users.id')

        ->leftJoin('users AS user_contacts', function ($join) {
            $join->where('comments.company_contact_kind', '=', 'user')
                 ->on('comments.company_contact', '=','user_contacts.id');
        })
        ->leftJoin('company_contacts', function ($join) {
            $join->where('comments.company_contact_kind', '=', 'contact')
                 ->on('comments.company_contact', '=','company_contacts.id'); 
        })
        ->where('comments.commentable_type', $request->type)
        ->where('comments.commentable_id', $request->company_id)
        ->where(function($query) use ($request){
        $query->orWhere('body', 'LIKE', '%' . $request->q . '%')
            ->orWhere('users.first_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('users.last_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('user_contacts.first_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('user_contacts.last_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('company_contacts.first_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('company_contacts.last_name', 'LIKE', '%' . $request->q . '%')
            ->orWhere('comments.contact_type', 'LIKE', '%' . $request->q . '%')
            ->orWhere('tags', 'LIKE', '%' . $request->q . '%');
        })
        ->orderBy('comments.created_at', 'DESC')
        ->select('comments.*')
        ->get();

我从未使用过Laravel,但如果我正确阅读文档,请尝试更改

->join('users AS user_contacts', 'comments.company_contact', '=', 'user_contacts.id')
->join('company_contacts', 'company_contacts.id', '=', 'comments.company_contact')

->join('users AS user_contacts', function ($join) {
            $join->on('comments.company_contact', '=','user_contacts.id')
                 ->andOn('comments.company_contact_kind, '=', 'user'); } )
->join('companyusers AS user_contacts', function ($join) {
            $join->on('comments.company_contact', '=','company_contacts.id')
                 ->andOn('comments.company_contact_kind, '=', 'contact'); } )