Laravel 多关系数据获取

Posted

技术标签:

【中文标题】Laravel 多关系数据获取【英文标题】:Laravel Multiple relationships data fetch 【发布时间】:2021-05-06 17:52:22 【问题描述】:

美好的一天。我在 laravel 有这个关系问题 我有三个模型

    用户 状态 学校

我在它们之间建立了如下关系

一个。学校 - 用户(一个用户可以注册多个学校)

在用户模型中

public function schools()
        return $this->belongsToMany('App\Models\School', 'school_user', 'user_id', 'school_id');

b.一个学校可以有很多用户

学校模式

public function users()
        return $this->belongsToMany('App\Models\User', 'school_user', 'school_id', 'user_id');

c。一所学校属于一个州(即可以在一个州找到)

学校模式

public function states()
        return $this->belongsTo('App\Models\State');

d。一个州有很多学校

在状态模型中

public function schools()
        return $this->hasMany('App\Models\School');

现在,我知道如何查询具有直接关系的模型了。例如,我可以获取与学校相关联的用户,反之亦然。我也可以得到一个州的学校。

我的问题 如何获取与给定状态的学校相关联的所有用户(使用查询)?假设我们所拥有的只是一个州的名称。

并且可能获取用户关联的所有学校以及与学校关联的日期(时间)?

这就是我所做的。第二个问题没有给我答案

public function details()
        
        //Get all schools associated with a state 
        $schools = State::with('schools')->where('id',1)->first();
        
         foreach($schools->schools as $data)
          //Get all users associated with the schools
          $users = School::with('users')->where('id',$data->id);
          dd($users);  
            
    

除了这种方法可能不正确之外,我没有得到任何答案。有没有可以解决这个问题的查询或方法?

谢谢。

【问题讨论】:

【参考方案1】:

您应该在关系数组属性中看到相关模型

$school= App\Models\School::with('User', 'State')->get();

【讨论】:

【参考方案2】:

使用whereHas,您可以获得属于具有给定state_id 的学校的所有用户。

$state = State::find(1);

$users = User::whereHas('schools', function ($query) use ($state) 
    $query->where('state_id', $state->id);
)->get();

Querying Relationship Existence

如果您需要更多功率,您可以使用whereHasorWhereHashas 查询上定义附加查询约束的方法, 比如检查评论的内容:

use Illuminate\Database\Eloquent\Builder;

// Retrieve posts with at least one comment containing words like code%...
$posts = Post::whereHas('comments', function (Builder $query) 
    $query->where('content', 'like', 'code%');
)->get();

// Retrieve posts with at least ten comments containing words like code%...
$posts = Post::whereHas('comments', function (Builder $query) 
    $query->where('content', 'like', 'code%');
, '>=', 10)->get();

【讨论】:

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

如何在 Laravel 中从多对多关系的一对多关系中获取项目?

如何从 laravel 中的中间表(多对多关系)中获取数据

如何在laravel中获取多对多关系项

从laravel中的多对多关系中获取单列

Laravel 5.4雄辩的一对多关系

Laravel - 以一对多关系获取最后一条记录