在 CakePHP2 中将模型链接在一起时出现问题
Trouble linking models together in CakePHP2
我正在使用 CakePHP 2.6.7。
这是我的数据库(简体):
***Users***
id
username
***Cars***
id
CarMake
CarModel
NumberPlate
user_id
***Addresses***
id
address
postalcode
city
country
***Addresses_Users***
user_id
address_id
这就是我想要的:
- 一个用户可以拥有多辆车,一辆车只能由一个用户拥有。
- 一个用户可以拥有多个地址,一个地址可以由多个用户拥有。
- 一辆车可以有多个地址,一个地址可以被多辆车拥有。
所以现在我有一个模型 User.php :
<?php
class User extends AppModel {
public $hasMany = array(
'Car' => array(
'classname' => 'Car')
);
public $hasAndBelongsToMany = array(
'Address' => array(
'classname' => 'Address')
);
?>
还有一个模型Car.php:
<?php
class Car extends AppModel {
public $belongsTo = array(
'User' => array(
'className' => 'User'
)
);
public $hasMany = array(
'Address' => array(
'classname' => 'Address')
);
}
?>
还有一个模型 Address.php :
<?php
class Address extends AppModel {
public $belongsTo = array(
'User' => array(
'className' => 'User'
),
'Car' => array(
'classname' => 'Car')
);
}
?>
我尝试 link 有地址的汽车,但我无法让它工作...
如果我执行 debug($this->User->find());
我会得到这样的结果:
array(
'User' => array(
'id' => '1',
'username' => 'wblondel',
),
'Car' => array(
(int) 0 => array(
'id' => '2',
'CarMake' => 'Allard',
'CarModel' => '2005',
'NumberPlate' => '56QDS1',
'user_id' => '1',
),
(int) 1 => array(
'id' => '5',
'CarMake' => 'Alvis',
'CarModel' => '25',
'NumberPlate' => '5lDS1',
'user_id' => '1',
)
),
'Address' => array(
(int) 0 => array(
'id' => '2',
'address' => 'fghfghgf',
'postalcode' => '78200',
'city' => 'buchelay',
'country' => '40'
),
(int) 1 => array(
'id' => '3',
'address' => 'jkjkjk',
'postalcode' => '69100',
'city' => 'villeurbanne',
'country' => '59'
)
)
)
我首先想要的是在每辆车中有一个数组"address"...
谢谢!
要控制从 find()
查询中检索到的内容,您可以使用 ContainableBehavior.
顺便说一下,我认为您的 Address
模型有误,因为地址不是 "belong to" 用户,但可以有很多用户。它应该是一个 HABTM 关系,就像您在 User
模型中所做的那样。
根据您的描述,您的联想似乎是错误的。它们应该是这样的:-
用户
<?php
class User extends AppModel {
public $hasMany = array(
'Car'
);
public $hasAndBelongsToMany = array(
'Address'
);
}
汽车
<?php
class Car extends AppModel {
public $belongsTo = array(
'User'
);
public $hasAndBelongsToMany = array(
'Address'
);
}
地址
<?php
class Address extends AppModel {
public $hasAndBelongsToMany = array(
'Car',
'User'
);
}
您不需要使用className
,除非您要使用的别名与模型名称不同或模型属于插件。
然后,如果您使用 Containable behavior,您应该能够使用类似以下的方法取回所有内容:-
$this->User->find(
'all',
array(
'contain' => array(
'Address',
'Car' => array(
'Address'
)
)
)
);
我正在使用 CakePHP 2.6.7。
这是我的数据库(简体):
***Users***
id
username
***Cars***
id
CarMake
CarModel
NumberPlate
user_id
***Addresses***
id
address
postalcode
city
country
***Addresses_Users***
user_id
address_id
这就是我想要的:
- 一个用户可以拥有多辆车,一辆车只能由一个用户拥有。
- 一个用户可以拥有多个地址,一个地址可以由多个用户拥有。
- 一辆车可以有多个地址,一个地址可以被多辆车拥有。
所以现在我有一个模型 User.php :
<?php
class User extends AppModel {
public $hasMany = array(
'Car' => array(
'classname' => 'Car')
);
public $hasAndBelongsToMany = array(
'Address' => array(
'classname' => 'Address')
);
?>
还有一个模型Car.php:
<?php
class Car extends AppModel {
public $belongsTo = array(
'User' => array(
'className' => 'User'
)
);
public $hasMany = array(
'Address' => array(
'classname' => 'Address')
);
}
?>
还有一个模型 Address.php :
<?php
class Address extends AppModel {
public $belongsTo = array(
'User' => array(
'className' => 'User'
),
'Car' => array(
'classname' => 'Car')
);
}
?>
我尝试 link 有地址的汽车,但我无法让它工作...
如果我执行 debug($this->User->find());
我会得到这样的结果:
array(
'User' => array(
'id' => '1',
'username' => 'wblondel',
),
'Car' => array(
(int) 0 => array(
'id' => '2',
'CarMake' => 'Allard',
'CarModel' => '2005',
'NumberPlate' => '56QDS1',
'user_id' => '1',
),
(int) 1 => array(
'id' => '5',
'CarMake' => 'Alvis',
'CarModel' => '25',
'NumberPlate' => '5lDS1',
'user_id' => '1',
)
),
'Address' => array(
(int) 0 => array(
'id' => '2',
'address' => 'fghfghgf',
'postalcode' => '78200',
'city' => 'buchelay',
'country' => '40'
),
(int) 1 => array(
'id' => '3',
'address' => 'jkjkjk',
'postalcode' => '69100',
'city' => 'villeurbanne',
'country' => '59'
)
)
)
我首先想要的是在每辆车中有一个数组"address"...
谢谢!
要控制从 find()
查询中检索到的内容,您可以使用 ContainableBehavior.
顺便说一下,我认为您的 Address
模型有误,因为地址不是 "belong to" 用户,但可以有很多用户。它应该是一个 HABTM 关系,就像您在 User
模型中所做的那样。
根据您的描述,您的联想似乎是错误的。它们应该是这样的:-
用户
<?php
class User extends AppModel {
public $hasMany = array(
'Car'
);
public $hasAndBelongsToMany = array(
'Address'
);
}
汽车
<?php
class Car extends AppModel {
public $belongsTo = array(
'User'
);
public $hasAndBelongsToMany = array(
'Address'
);
}
地址
<?php
class Address extends AppModel {
public $hasAndBelongsToMany = array(
'Car',
'User'
);
}
您不需要使用className
,除非您要使用的别名与模型名称不同或模型属于插件。
然后,如果您使用 Containable behavior,您应该能够使用类似以下的方法取回所有内容:-
$this->User->find(
'all',
array(
'contain' => array(
'Address',
'Car' => array(
'Address'
)
)
)
);