CakePHP 3 - 关联BelongsToMany和hasMany - 通过选择限制列

时间:2016-09-05 06:21:37

标签: php mysql cakephp associations cakephp-3.0

美好的一天! 我对CakePHP 3有一个小问题。我有这样的联想:

       $this->belongsToMany('AdminUserGroup',[
        'classname' => 'AdminUserGroup',
        'foreignKey' => 'admin_user_id',
        'targetForeignKey' => 'group_id',
        'joinTable' => 'AdminUsersGroups'
    ]);

我正在使用此代码返回记录:

public function getAll()
{
    $ble = $this->find()
        ->contain(['AdminUserGroup' ]);
        return $ble;
}

直到它工作,但当我想选择指定的字段时,我有问题。当我添加select方法时,我不会看到包含的表中的列:

public function getAll()
{
    $ble = $this->find()->select(['id', 'name', 'surname'])
        ->contain(['AdminUserGroup']);
        return $ble;
}

所以我添加了回调查询:

public function getAll()
{
    $ble = $this->find()->select(['id, name, surname'])
        ->contain(['AdminUserGroup' => function ($q) { return $q->select(['group_name']);}]);
        return $ble;
}

但它仍然无法运作。我只能看到主表中的字段。包含表格的字段不会出现。

{
    "id": "8",
    "name": "Ola",
    "lastname": "BleBle",
    "admin_user_group": []
},
我可以修理它吗?

2 个答案:

答案 0 :(得分:2)

manual包含以下评论:

  

限制从关联中提取的字段时,必须确保选择了外键列。如果未选择外键字段,将导致相关数据不会出现在最终结果中。

  

如果您使用select()限制了要加载的字段,但又希望从包含的关联中加载字段,则可以将关联对象传递给select()。

  

或者,如果您有多个关联,则可以使用autoFields()。

那里有一些有用的例子。所以:

$ble = $this->find()
    ->select(['id', 'name', 'surname'])
    ->contain(['AdminUserGroup' ])
    ->autoFields(true);

或者如果您使用3.1或更高版本:

$ble = $this->find()
    ->select(['id', 'name', 'surname'])
    ->select($this->AdminUserGroup);

从示例中看,第二个版本中可能不需要contain调用,因此我将其删除了。

答案 1 :(得分:0)

尝试这样的事情。 $ble = $this->find()->select(['Table.id, Table.name, Table.surname'])->contain(['AdminUserGroup']);