Php 基于ID列表与Eloquent进行连接
我已经建立了两个有说服力的模型,在两个方向上都有Php 基于ID列表与Eloquent进行连接,php,mysql,join,orm,eloquent,Php,Mysql,Join,Orm,Eloquent,我已经建立了两个有说服力的模型,在两个方向上都有关系。这很好,但现在我需要在关系中进行更详细的查询。为了简单起见,假设表具有以下列: wigs: - id - name - type heads: - id - name heads_wigs: - head_id - wig_id 现在,我需要在给定的头部id列表中获取一系列带有给定类型的假发。因此,我得到的是: awig类型 带有头的数组id 我正在使用laravel之外的Elount,所以我想开始在模型上构建ORM查询。比如: W
关系。这很好,但现在我需要在关系中进行更详细的查询。为了简单起见,假设表具有以下列:
wigs:
- id
- name
- type
heads:
- id
- name
heads_wigs:
- head_id
- wig_id
现在,我需要在给定的头部
id
列表中获取一系列带有给定类型
的假发。因此,我得到的是:
- a
wig
类型
- 带有
头的数组
id
我正在使用laravel之外的Elount,所以我想开始在模型上构建ORM查询。比如:
Wig::where( 'type', $type )-> ... //here the code to make the join on head id's
这就是我对SQL的理解所缺乏的地方,但我认为这应该不太难实现
更新:
用一句话重新表述:获取所有与头部有归属关系的type=wig_type假发[1,2,3,5,6,8,9]
。我想通过执行一个查询,得到一组假发。您可以这样做
Head::whereIn('id', $head_id_array)->load(['wig' => function($query) use ($wig_type) {
$query->where('type', $wig_type);
}])->get();
或
如果我没弄错你的问题
或
这样,返回的wig对象将有一个匹配头部ID的数组
您可以在您的假发模型上使用以下方法:
class Wig extends Eloquent {
public function heads()
{
return $this->belongsToMany('Head');
}
/**
* @param array $head_ids Provided head id array
* @return array Array of this wigs head id's which match the provided head ids
*/
public function matchingHeadIds($head_ids)
{
return $this->heads()->whereIn('id', $head_ids)->get()->lists('id');
}
}
然后像这样使用它
$wig = Wig::where('type', $wig_type);
$wig->matchingHeadIds($head_ids);
编辑
对于像eloquent这样的ORM来说,这不是一项简单的任务,因为它将每条记录视为表中的一行,所以类似的事情不起作用:
$wigs = Head::whereIn('id', $head_ids)->wigs()->where('type', $wig_type)->get();
有一种方法可以使用,如下所示:
Wig::where('type', $wig_type)->whereHas('heads', function ($query) use ($head_ids) {
$query->whereIn('id', $head_ids);
})->get();
这会给你你想要的结果。这不是我的目标。我将试着用一句话来重新表述:获取所有与头部有归属关系的type=wig_type的假发[1,2,3,5,6,8,9]
。我想通过执行一个查询来获得一组假发。我已经修改了我的答案。太棒了,谢谢!这正是我想要的。对我来说,whereHas
方法似乎是最符合逻辑的,现在我只需要检查哪一种方法的性能最好。
$wigs = Head::whereIn('id', $head_ids)->wigs()->where('type', $wig_type)->get();
Wig::where('type', $wig_type)->whereHas('heads', function ($query) use ($head_ids) {
$query->whereIn('id', $head_ids);
})->get();