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();