Laravel 关系多个 where has

Posted

技术标签:

【中文标题】Laravel 关系多个 where has【英文标题】:Laravel relationship multiple where has 【发布时间】:2019-11-24 02:30:30 【问题描述】:

假设我有这个数据库结构:

Table A:
-id
-user_id

Table B:
-id
-user_id

Table C:
-id
-user_id

Users:
-id

这是我的用户模型

namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable

    use Notifiable;

    protected $table = 'users';
    protected $fillable = ['name','email','username','password'];

    /**
     * Relationships
     */

    public function tableA()
    
        return $this->hasOne(\App\Models\TableA::class);
    
    public function tableB()
    
        return $this->hasOne(\App\Models\TableB::class);
    
    public function tableC()
    
        return $this->hasOne(\App\Models\TableC::class);
    
    public function tableD()
    
        return $this->hasOne(\App\Models\TableD::class);
    


这就是我想要实现的目标:

public function tables()

    // return all records from all 3 tables (Table A, Table B, Table C)

我可以通过在 User 模型中定义一个关系来获取有关表的特定信息的方法,说它有 TableA、TableB 等的一条记录。但是,我正在寻找一种方法来查找其中的哪一个表 (a,b,c,d) 有一个用户的 Fk,遵循相同的关系概念。

注意:在这种情况下,多态不是解决方案

【问题讨论】:

你为这个问题做了什么? 请添加更多上下文 - 特别是,这个问题到底与 Laravel 有什么关系? @BhargavChudasama 直到现在,我正在建立单一的关系并给他们打电话,但我正在寻找一种简单而有效的方法来实现这一点,一种综合的方式。 @NicoHaase 它是一个具有雄辩关系的 laravel 项目,为什么这与 laravel 无关?我应该用 node js 标记它吗? 如果您使用特定技术标记问题,您应该为其提供上下文。如果唯一的问题是从现有数据库中读取外键,那么唯一涉及的技术可能是数据库系统。如果我理解错了,请添加涉及的源代码 【参考方案1】:

如果您想要在所有其他表(即 TableA、TableA 等)中包含数据的用户记录,您可以使用以下查询,因为您已经定义了关系:

$users = User::whereHas('tableA')
             ->whereHas('tableB')
             ->whereHas('tableC')
             ->get();

如果您想访问相关表的数据,您可以使用以下查询:

 $users = User::with('tableA','tableB','tableC')
              ->whereHas('tableA')
              ->whereHas('tableB')
              ->whereHas('tableC')
              ->get();

【讨论】:

你的时间,这有效,但我期待更抽象,更无代码的东西。到目前为止,这是最好的答案,但我不会接受它以找到更好、更干净的方法(至少现在是这样)。顺便说一句,您的口才必须是 orWhereHas 才能获得所有表格。【参考方案2】:

使用 Eloquent 本地范围来实现您想要做的事情: class User public function scopeAllTables($query) return $query->join('table_a', 'table_a.user_id', '=', 'users.id') ->join('table_b', 'table_b.user_id', '=', 'users.id') ->join('table_c', 'table_c.user_id', '=', 'users.id') ->select('users.*') ->addSelect('table_a.id AS table_a_id') ->addSelect('table_b.id AS table_b_id') ->addSelect('table_c.id AS table_c_id');

在您的控制器中,您可以这样调用: $allTables = User::allTables()->get();

【讨论】:

你的时间,听起来它有效,但我正在寻找急切的加载

以上是关于Laravel 关系多个 where has的主要内容,如果未能解决你的问题,请参考以下文章

Laravel多个withCount在同一关系上

Laravel 关系使用 Where

Laravel 查询关系 where 子句

多个where子句,Laravel

如何在 laravel 雄辩的关系中使用 where 子句

Laravel关系列'id'在where子句中不明确