【发布时间】:2015-05-14 08:37:34
【问题描述】:
我有一些关系(希望我可以正确解释)并且需要按照本质上是远距离的关系对输出进行排序。
我有一个数据透视表,其中包含许多关系的详细信息,包括我想要排序的关系。
--用户.php
public function players()
{
return $this->belongsToMany('App\Models\Player', 'league_player_user')->withPivot('position_id');
}
--Player.php
public function position()
{
return $this->belongsToMany('App\Models\Position', 'league_player_user');
}
我会渴望像这样加载关系;
$user = User::with('players')->where('id', Auth::user()->id)->first();
所以,我想我想做这样的事情(不起作用)。
$user = User::with(['players' => function($q){
$q->orderBy('position.sort_id', 'asc');
}])->where('id', Auth::user()->id)->first();
关键的Table结构看起来有点像这样;
league_player_user.
...league_id
...player_id
...user_id
...position_id
Positions 表包含 sort_id
希望这是足够的信息,如果需要,请请求更多信息。非常感谢。
【问题讨论】:
-
User模型中的belongsToMany将自动加入数据透视表(和远表 (players)),但不会加入position表(即使你说您想要position_id列。因此,您需要确保自己添加额外的连接。我认为您可以使用User::with('players', 'players.position')执行此操作(尽管position_id是来自枢轴关系的虚拟字段,您可能不会能这样,你得玩代码)。关键是,position不会自动加入,所以你不能点它。 -
谢谢@alexrussell。我看过这个,是的 - 也渴望加载嵌套关系。然后我可以在 player.position 中使用 orderBy() 查询,虽然它没有错误,但它也没有对结果进行正确排序..
-
而不是使用
->first()使用->toSql()来返回它生成的SQL - 这将帮助您准确调试ORM 的内容。 -
感谢@alexrussell,但在这种情况下,这对我来说并没有任何结果——它似乎没有提供任何对我有帮助的细节!
-
好吧,我想我明白你在做什么了 - 获得一个用户,但他们的玩家已经填充并按位置排序。我是否可以建议,为了使您的查询更简单,您不要急于加载播放器。因此,您需要预先做的就是
$user = Auth::user();。然后,在关系上(players()方法)你做特殊的排序工作:return $this->belongsToMany('App\Models\Player', 'league_player_user')->withPivot('position_id')->join('position', 'league_player_user.position_id', '=', 'position.id')->orderBy('position.sort_id');
标签: php laravel laravel-5 eager-loading