"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.id
或 company_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'); } )
我的问题有三个 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.id
或 company_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'); } )