我的模型设置如下:
Alpha hasMany Gamma
Beta hasMany Gamma
Gamma belongsTo Alpha
Gamma belongsTo Beta
现在,让我们说我有一个Alpha对象。我想得到所有与Alpha对象有Gamma对象的Betas。有一个很好的Laravel方式吗?
我可以想到一个解决方法:
// getting an ids list (L5.1 syntax)
$beta_ids = $alpha->gammas()->groupBy('beta_id')->lists('beta_id')->all();
$bets = Beta::whereIn('id', $beta_ids);
但这感觉非常像黑客。是否有合适的Laravel方式?
答案 0 :(得分:1)
你的方式如果不那么hacky和可读性。我会考虑避免分组,因为它可能是一个非常昂贵的操作。
中whereIn()中的重复ID不应该是一个很大的阻力。如果你还想要一个替代单行,那么我猜你可以这样做:
$betas = $alpha->gammas->whereHas('beta')->get()->transform(function($gamma) { return $gamma->beta; });
Transform()将遍历每个元素并返回匿名函数中定义的元素。请记住,这将执行比第一个解决方案更多的SQL查询。