Laravel Eloquent ORM 中的 join()->where()

Posted

技术标签:

【中文标题】Laravel Eloquent ORM 中的 join()->where()【英文标题】:join()->where() in Laravel's Eloquent ORM 【发布时间】:2014-08-19 15:42:23 【问题描述】:

我实际上是在使用每个帐户的子域在单个域下构建一个多站点站点。每个帐户都有一组唯一的用户名,但并非在所有站点中都是唯一的。因此,帐户 1 上可能有一个“tom”,帐户 2 上可能有一个“tom”,但任何单个帐户上都没有 2 个 tom。

我的 users 表有一个指定 account_id 的列,而我的控制器有子域。那么,在查询用户时,如何确保用户account_id 匹配帐户id,其中帐户id = users.account_idaccounts.subdomain = $subdomain

这是我正在尝试的:

$user = User::whereUsername($username)
    ->leftJoin('accounts', 'accounts.id', '=', 'users.account_id')
    ->where('accounts.id', '=', 'users.account_id')
    ->where('accounts.subdomain', '=', $subdomain)
    ->firstOrFail();

问题在于它将users.account_id 作为文字字符串而不是表引用。

其次,关于此设置,是否有更好的方法来解决此问题,以便每当我在子域上时,它只会提取相关数据而无需我重复?

更新: 我设法通过使用 DB::raw() 使查询工作,但我很好奇是否有更好的方法。

$user = User::whereUsername($username)
    ->leftJoin('accounts', 'accounts.id', '=', 'users.account_id')
    ->where('accounts.id', '=', DB::raw('users.account_id'))
    ->where('accounts.subdomain', '=', $subdomain)
    ->firstOrFail();

另外,仍然有兴趣收到我的第二个问题的答案。

【问题讨论】:

【参考方案1】:

我设法通过使用 DB::raw() 使查询正常工作,但我很好奇是否有更好的方法。

你有 whereRaw 方法。

$user = User::whereUsername($username)
->leftJoin('accounts', 'accounts.id', '=', 'users.account_id')
->whereRaw('accounts.id = users.account_id')
->where('accounts.subdomain', '=', $subdomain)
->firstOrFail();

其次,关于此设置,是否有更好的方法来解决此问题,以便每当我在子域上时,它只会提取相关数据而无需我重复?

您可以使用 globalScopes:https://laravel.com/docs/5.3/eloquent#query-scopes

【讨论】:

【参考方案2】:

->where(X, Y) 将 X 列与 Y 进行比较。

->whereColumn(X, Y) 将 X 列与 Y 列进行比较。

【讨论】:

以上是关于Laravel Eloquent ORM 中的 join()->where()的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent ORM 中的 join()->where()

Laravel 数据库操作之Eloquent ORM模型

如何在 Eloquent ORM laravel 中获取最后一个插入 ID

Laravel系列4.3模型Eloquent ORM的使用

Laravel Eloquent ORM字段处理

laravel 中的 Eloquent ORM 里,hasOne 和 belongsTo 有啥区别