如何使用MySQL函数定义Eloquent关系?

时间:2015-06-24 20:49:02

标签: laravel eloquent laravel-5

我在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))

1 个答案:

答案 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()获得最终结果。我实际上并没有运行代码,但基本上这就是你需要做的。