Laravel:我如何在with语句中使用where?

时间:2016-07-09 23:04:19

标签: php eloquent laravel-5.2

我的网址如下:site.com/athletes/1 每个运动员都可以有很多职位。从上面的网址,我试图让所有属于1的位置的运动员。我的关系工作得很好,但无论网址是多少,我都会返回所有运动员。

我有3张桌子:athletespositions& athlete_position

athletes
    id
    name

positions
    id
    name

athlete_position
    athlete_id
    position_id

Athlete.php

 public function positions()
 {
    return $this->belongsToMany('App\Position', 'athlete_position', 'athlete_id', 'position_id');
 }

Position.php

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

AthleteController.php

public function position(Position $position) {
    $athletes = Athlete::with('positions')->get();

    dd($athletes); // returns all athletes with the position relationship
}

我需要这样的东西:

$athletes = Athlete::with('positions')->where('position_id', '=', $position->id)->get();

但是没有正确使用这种关系。有没有办法在模型中使用where子句?这样,当我访问网址site.com/athletes/2时,我只能找回属于2位的运动员?

感谢您的任何建议!

修改

一切都很好!非常感谢@lagbox!结果我再次思考一切。

只是一个快速的跟进问题。当运动员属于位置1 位置2时,最好的处理方法是什么?

在我的观点中循环运动员时,我应该只检查网址区域的位置ID,以便只显示具体位置吗?

类似的东西:

@foreach($athletes as $athlete)
    @foreach($athlete->positions as $position)
        @if($position->id == {{ Request::segment(3) }}
          // Show the athlete
        @endif
    @endforeach
@endforeach

否则,由于运动员属于位置1和2,运动员将在结果中出现两次。我只希望运动员出现一次 - 为了要求的位置。

例如:site.com/athletes/position/1

这就是我现在所看到的。

Athlete
    name: Foo
    position_id: 1

Athlete
    name: Foo
    position_id: 2

Athlete
    name: Bar
    position_id: 1

Athlete
    name: Bar
    position_id: 2

从上面的同一个网址,我想回来的是:

Athlete
    name: Foo
    position_id: 1

Athlete
    name: Bar
    position_id: 1

1 个答案:

答案 0 :(得分:2)

您可以使用whereHas根据条件检查是否存在关系。

虽然看起来你应该能够使用你所拥有的位置模型实例,因为你已经有了反向关系设置。

$athletes = $position->athletes;
// or to also have all those athletes positions
$athletes = $position->athletes()->with('positions')->get(); // egaer loading
// or if you have `athletes` loaded already
$athletes = $position->athletes->load('positions'); // with lazy eager laoding

我有一篇小型的Eloquent Relationships文章,该文章介绍了一些查询关系的方法asklagbox - blog - Eloquent Relations

更新了问题: 你可能根本不需要运动员的位置,因为你知道你目前在该系列中拥有的所有运动员都有这个特定的位置。如果是这种情况,您只需将$position返回到视图。

return view(..., ['position' => $position]);

Athletes for Position: {{ $position->name }}
<ul>
@foreach ($position->athletes as $athlete)
    <li>{{ $athlete->name }}</li>
@endforeach
</ul>