首页 > 解决方案 > 如何在关联数据 CakePhp 3.x 中隐藏字段

问题描述

我有以下表,基本上是两个表连接。查找 Pops 的关联记录时,如何删除 _joinData 字段?

// PopsTable.php
public function initialize(array $config)
{
    parent::initialize($config);

    $this->setTable('pops');
    $this->setDisplayField('name');
    $this->setPrimaryKey('id');

    $this->belongsToMany('Menus', [
        'targetForeignKey' => 'menu_id',
        'foreignKey' => 'pop_id',
        'joinTable' => 'pop_menus',
    ]); 
}
// MenusTable.php
public function initialize(array $config)
{
    parent::initialize($config);

    $this->setTable('menus');
    $this->setDisplayField('name');
    $this->setPrimaryKey('id');

    $this->belongsTo('Categories', [
        'foreignKey' => 'category_id'
    ]);
    $this->hasMany('MenuDetails', [
        'foreignKey' => 'menu_id'
    ]);
    $this->hasMany('Orders', [
        'foreignKey' => 'menu_id'
    ]);
    $this->belongsToMany('Pops', [
        'targetForeignKey' => 'pop_id',
        'foreignKey' => 'menu_id',
        'joinTable' => 'pop_menus',
    ]);
}
// In PopsController.php

public function getAll() {
    $r = $this->Pops->find('all')
    ->contain(['Menus' => function(Query $q) {
        return $q->select(['name']);
    }])
    ->enableHydration(false)
    ->enableAutoFields(false)         
    ->formatResults(function (\Cake\Collection\CollectionInterface $results) {
        return $results->each(function ($row) {
            foreach ($row['menus'] as $m) {
                unset($m['_joinData']);     // Delete here the _joinData               
            }
        });
    });
    return json_encode($r,true);
  }

返回数据

 {
    "id": 1,
    "name": "umya Agropoli",
    "city": "Agropoli",
    "radius": 9,
    "capacity": 30,
    "cap": 127,
    "country": "Italy",
    "description": "Negozio anna 0",
    "active": 1,
    "book_hours_open": "1",
    "book_hours_close": "1",
    "menus": [
        {
            "name": "Base C",
            "_joinData": {
                "id": 1,
                "pop_id": 1,
                "menu_id": 2
            }
        }
     ]
   }

标签: cakephp-3.0

解决方案


问题在于水合:如果在查询中禁用它, formatResults 似乎不起作用。启用水合作用将起作用。实体(Menu.php在这种情况下)必须包含一个隐藏变量

 // in Menu.php
 protected $_hidden = ['password', '_joinData'];

推荐阅读