【问题标题】:Laravel Query builder in many to many Relationship多对多关系中的 Laravel 查询构建器
【发布时间】:2019-04-24 07:38:46
【问题描述】:

假设我有一个名为 Sportman 的模型和另一个名为 Sport 的模型通过 pivot 表链接:多对多关系。

他们的迁移示例代码。

# Sportmans migration
Schema::create('sportsmans', function (Blueprint $table) {
    $table->increments('id');
    $table->string('firstname');
    $table->string('lastname');
});

# Sports migration
Schema::create('sports', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('description');
});

这是它们在模型中的关系:

# Defining association in Sportsman model
public function sports(){
    return $this->belongsToMany( Sport::class, 'sportsman_has_sports', 'person_id', 'sport_id' );
}

# Defining association in Sports model
public function sportsman(){
    return $this->belongsToMany( Sportsman::class );
}

如何使用 Laravel 和 Eloquent 获得 sportsman 播放:

  1. 仅限“足球”
  2. 盒子或“游泳”
  3. “网球和篮球

这是我尝试为问题 2 做的事情:

Sportsman::with(['sports:person_id,id,name'->whereHas('sports', function ($query) {
    $query->whereIn('name', ['Box', 'Swimming'] );
});

最难的是第3题

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 帖子是用我的方法编辑的,以回答您的问题
  • 对于问题 2,您的方法有什么问题? “网球和篮球”是什么意思?
  • 它有效,但正如我所说,问题 3 更难。我正在考虑的是在调用 @987654328 后以编程方式执行它(问题 3) @方法
  • 既然已经有了解决方案,为什么还要问这个问题? “网球和篮球”是什么意思?

标签: php sql laravel laravel-5 eloquent


【解决方案1】:

你在 whereHas 函数上放了一个子查询...

Sportsman::whereHas('sports', function ($query) {
    $query->whereIn('name', ['Box', 'Swimming'] );
})
->with('sports')
->get();
// Below is your last question
Sportsman::where(function ($query) {
    $query->whereHas('sports', function ($subquery) {
        $subquery->where('name', 'Tennis');
    });
    $query->whereHas('sports', function ($subquery) {
        $subquery->where('name', 'Basket-ball');
    });
})
->with('sports')
->get();

【讨论】:

  • 它可以工作,但问题是它会执行一个更复杂/庞大的查询,因为对于请求中存在的每项运动,它都会添加一个额外的连接。那么你不认为在基本查询执行之后过滤结果(作为简单集合)会更好吗?
  • 我不建议您这样做,因为随着时间的推移数据会增长,您会将不必要的数据带到集合中,这会降低您的应用速度。
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 2012-04-19
  • 2016-10-06
  • 2018-11-02
  • 2015-05-29
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多