我在Eloquent中定义关系时遇到了麻烦。我有两张桌子。
第一个表包含电子邮件域。这是一个例子:
+-------+----------------+-----------+
| ed_id | ed_domain | ed_isp_id |
+-------+----------------+-----------+
| 17 | | 6 |
| 13 | aim.com | 1 |
| 12 | aol.com | 1 |
+-------+----------------+-----------+
第二个表包含有关我的用户的信息,其中一列是电子邮件地址。
我尝试使用...
进行设置public function users()
{
return $this->hasMany('Leadgen\Lead', \DB::raw('SUBSTRING_INDEX(l_email, \'@\', -1)'), 'ed_domain');
}
我期望发生的事情如下:
LEFT OUTER JOIN email_domains ON SUBSTRING_INDEX(email, '@', -1) = ed_domain
我收到的是SQL错误。
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'leads.SUBSTRING_INDEX(l_email, '@', -1)' in 'where clause' (SQL: select * from `leads` where `leads`.`SUBSTRING_INDEX(l_email, '@', -1)` in (aol.com))
答案 0 :(得分:1)
您无法使用标准的Laravel关系,因为它们需要将具有外键的相关表与主键配对。您可以做的是使用查询构建器执行LeftJoin并手动返回用户。
public function users() {
return DB::table('users as u')
->leftJoin('email_domains as ed', DB::raw('SUBSTRING_INDEX(u.email, \'@\', -1)'), '=', 'ed.ed_domain')
->select('u.*');
}
此函数将返回查询构建器对象,以便您可以根据需要进行进一步链接,最后使用->get()
获得最终结果。我实际上并没有运行代码,但基本上这就是你需要做的。