【问题标题】:Laravel: pivot table extra field in modelLaravel:模型中的数据透视表额外字段
【发布时间】:2023-04-06 08:01:01
【问题描述】:

假设我有一个 User 模型和 Country 模型。 用户最多可以同时拥有四个国家(本国和他想访问的三个国家)。 使用 Eloquent,我将创建一个具有额外类型字段的可旋转 country_user,这将对应于用户的选择、他首先放置的国家等。 所以再一次,有:

    User
     --id

    Country
     --id

    country_user
     --id
     --user_id
     --country_id
     --type

我需要获取所有拥有加拿大作为国家类型 1、英国作为国家类型 2、法国作为国家类型 3 和新西兰作为国家类型 4 的所有用户。如果我理解正确,那么我不能使用 wherePivot 来做到这一点,只有当我得到一个 User::all() 并遍历这个集合(这没有多大意义并且给数据库带来不必要的负载)。 用尽可能少的数据库查询来做到这一点的正确方法是什么? 还是我完全搞错了,应该有另一种方法来完成这项任务?

【问题讨论】:

  • 对于您描述的情况,最好在users 上有一个home_country_id,并为“愿望清单”国家/地区保留country_user 表(即他们想要访问的国家/地区列表) .您将定义两个关系,public function homeCountry() { return $this->belongsTo(Country::class, 'home_country_id'); } 和 public function countries() { return $this->hasMany(Country::class); }。 “类型”对于只有 1 可以具有与其他类型不同的类型的用例(如果我理解正确的话)感觉无关紧要。旁注pivot 表通常没有id,尽管它是无害的

标签: php mysql laravel eloquent


【解决方案1】:

您仍然可以使用在User 和Country 之间定义的relationship 搜索pivot 表。如果为了这个例子,我们称这种关系为countries,并且你想找到具有以下$criteria的人(坚持你的例子):

$criteria = [
    'canada' => 1,
    'uk' => 2,
    'france' => 3,
    'new zealand' => 4,
];

所以上面的key 是Country,value 是type。

要查找具有这些确切要求的Users,您可以执行以下操作:

$users = User::whereHas('countries');

collect($criteria)->each(function ($type, $country) use ($users) {
    $users->whereHas('countries', function (Builder $query) use ($type, $country) {
        $query->where(['name' => $country, 'type' => $type]);
    })->get();
});

然后用你的$users做点什么。

$users->get();

【讨论】:

    【解决方案2】:

    你可以HasMany的国家关系

    所以,在用户中应该是这样的

    public function countries() {
         return $this->hasMany('country_user_class', 'foreign_key_id_here')->latest()->take(4); // take 4 since the user can have 4 countries
    }
    

    查询看起来像这样。

    User::whereHas('countries', function($query) {
        $query->where('type', [1,2,3,4]);
    })->get();
    

    这会给你结果。这就是您可以使用 Query 实现它的方法。这样的问题总是可以通过 Query 来解决的。如果您对此还有任何疑问,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 2015-05-29
      • 2018-01-18
      • 2018-03-30
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      相关资源
      最近更新 更多