Laravel 5.6.8 Eloquent和多对多+多对一联接

时间:2018-03-14 07:50:16

标签: php laravel laravel-5

我在用户 - cityarea之间有多对多连接。 我也有连接cityarea的区域(一个cityarea只能连接一个区域)。

我有这个数据库结构:

用户

  • ID
  • 用户名
  • 密码

cityareas

  • ID
  • 名称
  • AREA_ID

cityarea_user

  • ID
  • cityarea_id
  • USER_ID

领域

  • ID
  • 名称

接下来我有模特

用户

public function cityareas()
{
    return $this->belongsToMany('App\Cityarea');
}

Cityarea

public function area()
{
    return $this->belongsTo('App\Area');
}

public function users()
{
    return $this->belongsToMany('\App\User');
}

区域

public function cityareas()
{
    return $this->hasMany('App\Cityarea');
}

问题:

如何通过Eloquent获取areas.name = "South"所有用户?

谢谢!

3 个答案:

答案 0 :(得分:2)

使用whereHas,您可以执行以下操作:

$users = User::whereHas('cityareas.area', function ($query) {
    $query->where('name', 'South');
})->get();

答案 1 :(得分:0)

Jeune Guerrier 解决方案是完美的,但您可以使用with()雄辩的方法如果您还需要cityarea收集以及用户集合。

$users = User::with('cityareas')->whereHas('cityareas.area', function ($query) {
    $query->where('name', 'South');
})->get();

答案 2 :(得分:-1)

这正是构建belongs to many关系的原因。

您只需要执行Cityarea::where('name', 'South')->first()->users;

如果您想对查询采取进一步措施,例如按用户创建的排序,你可以做到

Cityarea::where('name', 'South')->first()->users()->orderBy('creaated_at', desc')->get();

请注意,如果没有名称为“South”的Cityarea,则上面的->first()查询将返回null,因此无法获取用户。

以编程方式执行此操作的更高效方法是使用whereHas方法,如下面的评论所述。