我的网址如下:site.com/athletes/1
每个运动员都可以有很多职位。从上面的网址,我试图让所有属于1的位置的运动员。我的关系工作得很好,但无论网址是多少,我都会返回所有运动员。
我有3张桌子:athletes
,positions
& 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
答案 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>