是否有Laravel hasManyThrough等效于获取另一个父模型?

时间:2016-05-10 15:04:19

标签: laravel laravel-5

我的模型设置如下:

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方式?

1 个答案:

答案 0 :(得分:1)

你的方式如果不那么hacky和可读性。我会考虑避免分组,因为它可能是一个非常昂贵的操作。

中whereIn()中的重复ID不应该是一个很大的阻力。

如果你还想要一个替代单行,那么我猜你可以这样做:

$betas = $alpha->gammas->whereHas('beta')->get()->transform(function($gamma) { return $gamma->beta; });

Transform()将遍历每个元素并返回匿名函数中定义的元素。请记住,这将执行比第一个解决方案更多的SQL查询。