Laravel 如何使用MySQL函数定义有说服力的关系?

Laravel 如何使用MySQL函数定义有说服力的关系?,laravel,eloquent,laravel-5,Laravel,Eloquent,Laravel 5,我很难用雄辩的语言来定义一段感情。我有两张桌子 第一个表包含电子邮件域。以下是一个例子: +-------+----------------+-----------+ | ed_id | ed_domain | ed_isp_id | +-------+----------------+-----------+ | 17 | | 6 | | 13 | aim.com | 1 | | 12 |

我很难用雄辩的语言来定义一段感情。我有两张桌子

第一个表包含电子邮件域。以下是一个例子:

+-------+----------------+-----------+
| 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))

您不能使用标准的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.*');
    }

此函数将返回query builder对象,以便您可以根据需要进一步链接,并最终使用
->get()
获得最终结果。我没有实际运行代码,但基本上这就是您需要做的。

Laravel关系包括相关表、主键与外键配对、链接到透视表。我在你描述的结构中看不到这种关系。基本上,您需要的是一个进行连接的函数。查询生成器可能会派上用场。