【问题标题】:Laravel 5.6 Eloquent ORM where join tableLaravel 5.6 Eloquent ORM 连接表
【发布时间】:2018-08-07 15:16:34
【问题描述】:

我正在处理 Eloquent ORM 集合和查询构建器。我正在尝试弄清楚如何在集合中加入和使用“where”,例如在查询生成器中。

例如,我有以下表格:

用户

ID  |  Name  |  Last name
-------------------------
 1  | Martin | Fernandez
 2  | Some   | User

人员

ID  |  Nick  |  User_ID  |  Active
----------------------------------
 1  | Tincho | 1         |  1

公司

ID  | Name   | User_ID   |  Active
----------------------------------
 1  | Maramal| 1         |  0
 2  | Some   | 2         |  1

这是一个例子,我正在处理的表每一个都有 30 多列。我想选择所有活跃的用户。

通常我会做如下查询:

SELECT *
FROM users
LEFT JOIN persons ON users.id = persons.user_id
LEFT join companies ON users.id = companies.user_id
WHERE persons.active = 1
OR companies.active = 1

这可以翻译成 Laravel 查询构建器,例如:

DB::table('users')
   ->leftJoin('persons', 'users.id', '=', 'persons.user_id')
   ->leftJoin('companies', 'users.id', '=', 'companies.user_id')
   ->where('persons.active', 1)
   ->orWhere('companies.active', 1)
   ->get(); 

但我想使用的是 Laravel Eloquent ORM 集合,直到现在我正在执行以下操作:

$users= User::orderBy('id',' desc')->get();

foreach($users as $k => $user) {
    if($user->company && !$user->company->active || $user->person && !$user->person->active) {
        unset($users[$k]);
    }
    ... and here a lot of validations and unsets ...
 }

但我知道,此时我已经抓住了所有用户,而不是那些活跃的用户。

如何在集合中使用查询生成器实现我所做的工作?提前致谢。

【问题讨论】:

    标签: php mysql laravel laravel-5 mariadb


    【解决方案1】:

    应该这样做:

    $users = User::whereHas('companies', function($q) {
        $q->where('active', true);
    })->orWhereHas('persons', function($q) {
        $q->where('active', true);
    })->with(['companies', 'persons'])->orderBy('id', 'desc')->get();
    

    【讨论】:

    • 我完全忘记了这一点。谢谢!
    • 只是一个注释,其中whereHas('companies' companies 是模型的名称,而不是表的名称。
    • 其实是关系函数的名字
    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 2019-09-06
    • 2014-09-30
    • 2016-03-16
    • 2019-12-06
    • 2021-01-05
    • 2016-07-22
    • 2018-11-06
    相关资源
    最近更新 更多