php - 根据 ID 列表与 Eloquent 进行连接

标签 php mysql join orm eloquent

我已经建立了两个 Eloquent 模型,在两个方向上都具有 belongsToMany 关系。这工作得很好,但现在我需要在关系中进行更详细的查询。为简单起见,假设表格具有以下列:

wigs:
- id
- name
- type

heads:
- id
- name

heads_wigs:
- head_id
- wig_id

现在我需要在给定 head id 列表中获取一系列具有给定 typewigs > 的。所以我所拥有的是:

  • 假发 类型
  • 一个包含headid的数组

我在 laravel 之外使用 Eloquent,所以我想开始在模型上构建 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] 有 belongsToMany 关系的假发。我想通过执行单个查询来结束 wigs 的集合。

最佳答案

你可以这样做

Head::whereIn('id', $head_id_array)->load(['wig' => function($query) use ($wig_type) {
        $query->where('type', $wig_type);
}])->get();

Wig::where('type', $wig_type)->load(['heads' => function($query) use ($head_id_array) {
    $query->whereIn('id', $head_id_array);
}])->get();

如果我正确理解你的问题。

或者

$wig = Wig::where('type', $wig_type)->get();
$heads = $wig->heads()->whereIn('id', $head_id_array)->get();
$matching_head_ids = $heads->lists('id');
$wig->matching_head_ids = $matching_head_ids;

那样的话,返回的假发对象将有一个匹配的头部 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();

有一个whereHas您可以像这样使用可用的方法:

Wig::where('type', $wig_type)->whereHas('heads', function ($query) use ($head_ids) {
    $query->whereIn('id', $head_ids);
})->get();

这应该会为您提供所需的结果。

关于php - 根据 ID 列表与 Eloquent 进行连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29869190/

相关文章:

php - 使用 MySQL PDO 时出现段错误

mysql - 为什么MySQL查询这么慢?

php - 配置 apache2 的问题

PHP 无法从 mysqli 语句读取第二个结果集

mysql - mySQL中如何显示最高分

ruby-on-rails - Rails Habtm加入

MySQL 查询选择全部,仅找到两个选项之一

MySQL 加入日期列有 1 个月的滞后和性能问题

javascript - 从输入字段 Javascript 获取值

php - 使用联接时 Doctrine 查询生成器错误