从匹配生成的select中删除字段

时间:2015-07-10 14:23:53

标签: orm cakephp-3.0

我有两个自定义查找方法,我想将它们联合起来。

public function findInGroup(Query $query, array $options)
{
    return $query
      ->matching(
          'Groups',
          function ($q) {
                  return $q->where(['Groups.id' => 1]);
              }
      );
}

public function findAsUser(Query $query, array $options)
{
    return $query
      ->matching(
          'Users',
          function ($q) {
                  return $q->where(['Users.id' => 1]);
              }
      );
}

由于select调用,这两种方法会生成不同的matching列表。所以我不能把他们联合起来......

我不需要选择Groups__id等字段。

有没有办法告诉matching它不应该将匹配的数据字段添加到创建的选择字段列表中?

1 个答案:

答案 0 :(得分:1)

你有两个选择“

从主查询中选择所有字段

这将使查询构建器省略关联中的字段:

$query
    ->find('iGroup', $options)
    ->find('asUser', $options)
    ->select($table->schema()->columns());

通过专门选择您需要的列,您将省略可以连接的关联列,即匹配的列。

使用CakePHP 3.1

CakePHP 3.1引入了一个名为innerJoinWith()的新函数,它与matching()完全相同,但它不会从关联中选择任何列:

public function findInGroup(Query $query, array $options)
{
    return $query
      ->innerJoinWith(
          'Groups',
          function ($q) {
                  return $q->where(['Groups.id' => 1]);
              }
      );
}

public function findAsUser(Query $query, array $options)
{
    return $query
      ->innerJoinWith(
          'Users',
          function ($q) {
                  return $q->where(['Users.id' => 1]);
              }
      );
}