CakePHP 3表关系

时间:2017-03-03 10:11:05

标签: mysql cakephp cakephp-3.0

我有以下表格:cars,car_types和car_methods。我的问题是关系。汽车有一种类型和一种方法。

我的目标是展示汽车及其附件"汽车类型"和" car_method"。

汽车表:

id - type_id - method_id

Car_types表:

id - type

Car_methods表:

id - method

如何在我的Model表中进行设置,以便我可以在我的控制器中执行以下操作:

$this->Cars->CarTypes->find('all');

我尝试如下,但它会给出一个无关联错误:

汽车模型:

class CarsTable extends Table {
public function initialize(array $config)
{
    parent::initialize($config);

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

    $this->hasOne('CarTypes', [
        'className' => 'Cars.CarTypes',
        'foreignKey' => 'type_id',
        'propertyName' => 'type'
    ]);

    $this->hasOne('CarMethods', [
        'className' => 'Cars.CarMethods',
        'foreignKey' => 'method_id',
        'propertyName' => 'method'
    ]);
}
}

CarTypes型号:

class CarTypesTable extends Table {

public function initialize(array $config) {
    parent::initialize($config);

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

    $this->hasMany('Cars', [
        'foreignKey' => 'type_id'
    ]);
}
}

CarMethots模型:

class CarMethodsTable extends Table {

public function initialize(array $config) {
    parent::initialize($config);

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

    $this->hasMany('Cars', [
        'foreignKey' => 'method_id'
    ]);
}
}

2 个答案:

答案 0 :(得分:2)

你最后的两个关系是错的,这是好的

CarTypes型号:

public function initialize(array $config) {
    $this->hasMany('Cars', [  //A CarType hasMany Cars
        'foreignKey' => 'type_id'
    ]);
}

CarMethods模型:

public function initialize(array $config) {
    $this->hasMany('Cars', [  //A CarMethod hasMany Cars
        'foreignKey' => 'method_id'
    ]);
}

控制器操作

对于您的查询,请将这两个关系添加到contains选项:

//Get all cars with type and method
$this->Cars->find('all',
     [
        'contain' => ['CarTypes', 'CarMethods'] 
     ]
);

答案 1 :(得分:0)

  

belongsTo关联是hasOne和hasMany关联的自然补充:它允许我们从另一个方向查看数据。

     

belongsTo:当前模型包含外键。

如果表中有外键,那么该表将属于关联表。所以,在你的情况下:

public function initialize(array $config) {
     $this->belongsTo('CarTypes', [
        'foreignKey' => 'type_id',
        'joinType' => 'LEFT'
     ]);

     $this->belongsTo('CarMethods', [
         'foreignKey' => 'method_id',
         'joinType' => 'LEFT'
     ]);
}

在此之后,您可以使用$this->Cars->CarTypes->find('all');