我有以下表格: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'
]);
}
}
答案 0 :(得分:2)
你最后的两个关系是错的,这是好的
public function initialize(array $config) {
$this->hasMany('Cars', [ //A CarType hasMany Cars
'foreignKey' => 'type_id'
]);
}
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');