【问题标题】:Display all tables fields including hasMany associations in CakePHP 3在 CakePHP 3 中显示所有表字段,包括 hasMany 关联
【发布时间】:2016-01-26 05:51:03
【问题描述】:

我想从下表中取出所有内容并将它们显示在一个表中:

石油索赔表

    $this->belongsTo('Workers', [
        'foreignKey' => 'worker_id',
        'joinType' => 'INNER'
        //'through' => 'Selections'
    ]);

    $this->belongsTo('Vehicles', [
        'foreignKey' => 'vehicle_id',
        'joinType' => 'INNER'
    ]);

收费表

    $this->belongsTo('Workers', [
        'foreignKey' => 'worker_id',
        'joinType' => 'INNER'
    ]);

    $this->belongsTo('Vehicles', [
        'foreignKey' => 'vehicle_id',
        'joinType' => 'INNER'
    ]);

工人表

<?php
namespace App\Model\Table;

use App\Model\Entity\Worker;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;

/**
 * Workers Model
 *
 */
class WorkersTable extends Table
{

/**
 * Initialize method
 *
 * @param array $config The configuration for the Table.
 * @return void
 */
public function initialize(array $config)
{
    parent::initialize($config);

    $this->hasMany('Petrolclaims', [
        'className' => 'Petrolclaims'
    ]);

    $this->hasMany('Tollclaims', [
        'className' => 'Tollclaims'
    ]);

    $this->table('workers');
    $this->displayField('name');
    $this->primaryKey('id');

}

/**
 * Default validation rules.
 *
 * @param \Cake\Validation\Validator $validator Validator instance.
 * @return \Cake\Validation\Validator
 */
public function validationDefault(Validator $validator)
{
    $validator
        ->add('id', 'valid', ['rule' => 'numeric'])
        ->allowEmpty('id', 'create');

    $validator
        ->requirePresence('name', 'create')
        ->notEmpty('name');

    $validator
        ->add('createdDate', 'valid', ['rule' => 'datetime'])
        ->allowEmpty('createdDate', 'create');

    return $validator;
}

}

车辆表

    $this->hasMany('Petrolclaims', [
        'className' => 'Petrolclaims'
    ]);

    $this->hasMany('Tollclaims', [
        'className' => 'Tollclaims'
    ]);

WorkersController

    $results1 = $this->Workers->find('all')
    ->select([
        'Petrolclaims.worker_id', 'Petrolclaims.vehicle_id'
        'Tollclaims.worker_id', 'Tollclaims.vehicle_id', 
        'Workers.id',
        'Vehicles.id'
    ])
    ->order(['Workers.name' => 'ASC'])
    ->contain([
        'Tollclaims','Petrolclaims'
    ]);

我怎样才能做到这一点?

【问题讨论】:

    标签: php cakephp orm cakephp-3.0 has-many


    【解决方案1】:

    看看这是否有效:

    $results1 = $this->Workers->find()
        ->select(['id','name'])
        ->contain([
            'Petrolclaims'=>function ($q) {
                return $q
                    ->select(['id','worker_id','vehicle_id'])
                    ->autoFields(false);
            },
            'Tollclaims'=>function ($q) {
                return $q
                    ->select(['id','worker_id','vehicle_id'])
                    ->autoFields(false);
            },
        ])
        ->order(['name' => 'ASC']);
    
    
        // EDIT: hasMany data can be accesed by doing the following:
        foreach ($results1 as $worker) {
            echo $worker->petrolclaims[0]->vehicle_id;
        }
    

    注意:以上代码未经测试。

    您不需要从表Vehicles 中获取数据,因为您只需要Vehicles.id,它已经包含在外键Petrolclaims.vehicle_idTollclaims.vehicle_id 中。

    【讨论】:

    • 我使用了你的代码,当我尝试打印 $results1 时,输出:SELECT Workers.id AS Workers__id, Workers.name AS Workers__name FROM workers Workers ORDER BY Workers.name ASC为什么它不包括石油和索赔表中的字段?或者我应该如何调用内容?谢谢你的时间..
    • 嗨,仍然输出与我之前提到的相同的结果。这些表关系是否正确定义?
    • 同理,只会选择Workers表中的内容。未检测到其他两个表。有什么建议吗?谢谢。
    • 你确定 CakePHP 正在从文件中加载类吗?确保路径和文件名正确。一个技巧是在代码中包含垃圾以强制出现语法错误。如果没有抛出语法错误,那么可能是文件名错误,而 CakePHP 使用的是通用模型。
    • 我把hasMany改成hasMasny,它显示'Unknown method "hasMasny"',这个测试是否证明它是从类加载的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多