在Laravel中加入并订购多态关系

时间:2017-05-29 09:22:04

标签: php mysql laravel-5 eloquent

我有问题。比方说,我有一张

personal_contacts[name, email, something_else]

organisation_contacts[title, email, something, smth_else]

两个表都包含email列。

此外,我有一张

needed_contacts[belonging_id, belonging_type]

与其他两个有多态关系。

现在,我需要按关系的needed_contacts字段订购email。我计划使用连接而不是通过电子邮件字段进行排序,但如果我不重命名一个字段,我会收到错误:

Integrity constraint violation: Column 'email' in field list is ambiguous

甚至可以实现,我想做什么?任何帮助,指示或评论将不胜感激。

我的PHP代码是:

NeededContact::leftJoin('personal_contacts', function($join){
   $join->on('personal_contacts.id', '=', 'needed_contacts.belonging_id')->where('needed_contacts.belonging_type', '=', 'PersonalContact');
})
->leftJoin('organisation_contacts', function($join){
   $join->on('organisation_contacts.id', '=', 'needed_contacts.belonging_id')->where('needed_contacts.belonging_type', '=', 'OrganisationContact');
})
->orderBy('email', 'desc');

1 个答案:

答案 0 :(得分:0)

该查询将产生包含两个电子邮件列的结果,每个相关表一个。您可以在订单语句中选择表格,如下所示:

->orderBy('personal_contacts.email', 'desc');

但是我想这不是您真正想要的。您可以将计算列添加到将两个电子邮件列合并为一个的选择中,然后按此新列排序:

->selectRaw("CONCAT(COALESCE(personal_contacts.email, ''), COALESCE(organisation_contacts.email, '')) AS concat_email")
->orderBy('concat_email', 'desc');