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的主要内容,如果未能解决你的问题,请参考以下文章