【问题标题】:Laravel 5.6.8 Eloquent and many to many + many to one joinsLaravel 5.6.8 Eloquent 和多对多 + 多对一连接
【发布时间】:2018-03-14 07:50:16
【问题描述】:

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

我有这个数据库结构:

用户

  • 身份证
  • 用户名
  • 密码

市区

  • 身份证
  • 姓名
  • area_id

cityarea_user

  • 身份证
  • cityarea_id
  • user_id

地区

  • 身份证
  • 姓名

接下来我有模型

用户

public function cityareas()
{
    return $this->belongsToMany('App\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" 的所有用户?

谢谢!!

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    通过使用whereHas,您可以:

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

    【讨论】:

      【解决方案2】:

      Jeune Guerrier 解决方案很完美,但是如果你还需要cityarea 收藏和用户收藏,你可以使用with() 雄辩的方法。

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

      【讨论】:

      • 感谢这很好用!现在我有了用户模型这个函数 /* * 检查 cityarea / public function hasCityarea($cityarea) { return null !== $this->cityareas()->where('name', $area)->第一的(); } 工作很棒。如何使用用户模型进行区域检查? / * 检查一个区域 */ public function hasArea($area) { }
      【解决方案3】:

      这正是建立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 方法,如下面的 cmets 中所述。

      【讨论】:

      • 您进行查询,获取结果,然后加载新查询以获取用户。这会导致大量开销。使用 whereHas 在一个查询中运行它。
      • 我猜你的意思是“这会导致开销”。用户也没有要求最佳性能。
      • 另外,当CityAreafirst() 上返回null 时会发生什么?有一个很好的空指针在那里等着。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 2013-02-09
      • 2021-12-28
      • 2019-06-13
      相关资源
      最近更新 更多