1

如何在新的 cakephp 3 查询构建器中动态构建包含。这就是我现在所拥有的:

$query = $dbTable->find()
                ->select($contain['select']['fields'])
                ->contain(function($q) use($array,$contain){
                      $new = [];
                      foreach($array as $v){
                        if(isset($contain['contains'][$v])){
                          $fields = $contain['contains'][$v];
                          $new[$v] = $q->select($fields);
                         }
                      }
                      return $new;
                  });

但是我遇到了几个错误:

Warning (2): Illegal offset type in isset or empty [CORE\src\ORM\EagerLoader.php, line 198]
Warning (2): strpos() expects parameter 1 to be string, object given [CORE\src\ORM\EagerLoader.php, line 203]
Warning (2): Illegal offset type [CORE\src\ORM\EagerLoader.php, line 223]
Warning (2): Illegal offset type [CORE\src\ORM\EagerLoader.php, line 224]
4

3 回答 3

2

正如 Lorenzo 已经提到的,这不是它的工作方式,contain()不接受可调用对象,只需查看文档:

http://api.cakephp.org/3.0/class-Cake.ORM.Query.html#_contain

select()此外,您的代码会在同一个查询上多次调用,这无论如何都行不通。

但是,查看您的代码,您似乎可以简单地使用该fields选项,即构建一个简单的数组以传递给contain(). 这在文档中显示,但是该示例将触发错误,因为似乎也需要显式设置外键字段:

$query->contain([
    'Articles' => [
        'fields' => ['foreign_key_column_name', 'title']
    ]
]);
于 2014-11-12T12:43:23.313 回答
1

您不能在内部使用带有闭包的 contains。如果您认为这是一个好主意(我认为它可能),那么请在 github 上打开一个增强请求。

于 2014-11-12T09:27:27.727 回答
0

要获取表格文章中的所有字段,请在您的控制器中执行此操作。

$query = $this->modelName->find('all')
                   ->contain('Articles');

如果您想要一个指定字段,请使用:

$query = $this->modelName->find('list', [
    'keyField' => 'id',
    'valueField' => 'author.name'
])->contain(['Articles']);

欲了解更多信息:https ://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html

于 2019-09-06T17:09:35.763 回答