【问题标题】:CakePHP 3 - Assocation BelongsToMany and hasMany - limit columns by selectCakePHP 3 - 关联 BelongsToMany 和 hasMany - 通过选择限制列
【发布时间】:2016-09-05 06:21:36
【问题描述】:

美好的一天! 我对 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;
}

直到它起作用,但是当我想选择指定的字段时,我遇到了问题。当我添加选择方法时,我看不到包含表中的列:

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": []
},

我可以修复它吗?

【问题讨论】:

  • 您的 SQL 查询看起来如何?提示:->select(['id, name, surname']) 将是 ->select(['id', 'name', 'surname'])
  • 别看那个。这是一个小错误,因为我是从脑海中编写的代码,它是有效的

标签: php mysql cakephp associations cakephp-3.0


【解决方案1】:

manual 包括以下 cmets:

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

如果您使用 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,所以我将其省略了。

【讨论】:

  • 感谢我的主人,我的主!你救了我的命。我差点被解雇,我的老板 Karolak 先生和主管 Hot17 小姐差点杀了我,因为我是一个糟糕的程序员。从今天起,我将成为一名优秀的程序员。非常感谢!
【解决方案2】:

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

【讨论】:

  • 不,它仍然不起作用,我的结果和以前一样:(
  • 那么您期待"admin_user_group": [] 中的数据吗?
  • 是的,来自“group_name”字段的数据。当我不使用 SELECT 方法时,我会看到该数据
  • 那么你正在寻找这个:$ble = $this->find()->select(['id, name, surname', 'AdminUserGroup.fieldName'])->contain([ 'AdminUserGroup']);
  • 那也行不通。我有语法错误:错误:SQLSTATE [42S22]:找不到列:1054 '字段列表'中的未知列'AdminUserGroup.group_name'。列名和表名输入正确
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多