我是CakePHP的新手,我有一个关系问题。
我的模型看起来像这样:
JNICALL
和我的表看起来像这样:
<?
class Operator extends AppModel
{
var $name = 'Operator';
var $hasOne = array('Contact','Adress','Land');
}
?>
我做错了什么?
答案 0 :(得分:6)
hasOne
关系仅在您具有1 to 1
关联时才能访问,以便能够访问模型中没有外键的关联模型。
在您的情况下,您希望使用belongsTo
,只要模型中的外键指向另一个模型,就会使用belongsTo
,您的Operator
模型具有外键指向Contact
,Address
,Land
。 contact_id
,address_id
和land_id
。
由于contact_id
字段位于Operator
模型中,因此Operator
模型属于 Contact
模型。
class Operator extends AppModel {
public $belongsTo = array('Contact') ;
}
在获取Operator
条目时,您会得到类似的内容:
Array(
[Operator] => Array
(
[id] => 42,
[name] => 'operator',
[contact_id] => 33
)
[Contact] => Array
(
[id] => 33,
[name] => 'contact'
)
)
由于您的Operator
属于 Contact
,您的Contact
hasOne 或 hasMany Operator
。让我们来说明两者之间的区别:
Contact
条目仅与一个 Operator
相关联,您可以在operator_id
模型中添加Contact
个外键,但这将是多余的,因为您已在contact_id
中使用Operator
建立关联。因此,您要做的是在Contact
模型中创建 hasOne 关联,因此Contact
hasOne Operator
。class Contact extends AppModel {
public $hasOne = array('Operator') ;
}
同样,在获取Contact
条目时,您将获得:
Array(
[Contact] => Array
(
[id] => 33,
[name] => 'contact'
)
[Operator] => Array
(
[id] => 42,
[name] => 'operator',
[contact_id] => 33
)
)
请注意,这与使用 belongsTo Operator
编辑Contact
时相同。 hasOne
和belongsTo
之间的区别主要是哪个模型的外键指向另一个。
Contact
条目的Eah与多个(多)Operator
相关联,在这种情况下,您的Contact
hasMany Operator
。class Contact extends AppModel {
public $hasMany = array('Operator') ;
}
再次,$this->Contact->find()
的输出:
Array(
[Contact] => Array
(
[id] => 33,
[name] => 'contact'
)
[Operator] => Array
(
[0] => Array
(
[id] => 42,
[name] => 'operator 42',
[contact_id] => 33
)
[0] => Array
(
[id] => 47,
[name] => 'operator 47',
[contact_id] => 33
)
)
)
现在,假设一个Operator
可以有多个Contact
,一个Contact
可以投放多个Operator
。在这种情况下,您需要一个额外的表(如果您遵循CakePHP命名约定,应该称为operators_contacts
),包含两个字段operator_id
和contact_id
:
class Contact extends AppModel {
public $hasAndBelongsToMany = array('Operator') ;
}
class Operator extends AppModel {
public $hasAndBelongsToMany = array('Contact') ;
}
$this->Contact->find('all')
的输出类似于使用 hasMany 关系的输出,主要区别在于它们不是operator_id
或contact_id
字段模特。
我们假设我有以下模型:Company
,Employee
,Address
以及以下约束:
Company
有各种Employee
,但只有一个CEO
是其Employee
Company
只有一个Address
,每个Address
最多只有一家公司您有以下表格:
CREATE TABLE companies (
id INTEGER AUTO_INCREMENT PRIMARY KEY,
ceo_id INTEGER REFERENCES employees (id)
) ;
CREATE TABLE employees (
id INTEGER AUTO_INCREMENT PRIMARY KEY,
company_id INTEGER REFERENCES companies (id)
) ;
CREATE TABLE addresses (
id INTEGER AUTO_INCREMENT PRIMARY KEY,
company_id INTEGER REFERENCES companies (id)
) ;
请注意,在这种情况下,您不能拥有包含所有约束的表,因为您在companies
和employees
之间有一个循环,您需要在之后添加约束。
以下CakePHP模型:
class Company extends AppModel {
/* A Company has many Employee. */
public $hasMany = array('Employee') ;
/* A Company has one CEO, but the key is in the Company model,
so it is a belongsTo relationship. */
public $belongsTo = array(
'CEO' => array(
'className' => 'Employee', // It's an Employee
'foreignKey' => 'ceo_id'
)
) ;
/* A Company has one address. */
public $hasOne = array('Address') ;
} ;
class Employee extends AppModel {
/* An Employee belongs to a Company. */
public $belongsTo = array('Company') ;
} ;
class Address extends AppModel {
/* An address belongs to a Company. */
public $belongsTo = array('Company') ;
} ;
注意我已在company_id
模型中添加了Address
个外键,因此Address belongsTo Company
和Company hasOne Address
我可以在address_id
内放置一个Company
{1}}模型,我会有Company belongsTo Address
和Address hasOne Company
。我在这里做了一个随意的选择,在一个真实的应用程序中你应该想到上面两个案例中哪一个是最有意义的。
另请注意,我定义模型的方式,没有任何内容可以阻止Employee
成为CEO
的{{1}},而不是Company
Employee
您可以在the CakePHP 2.x Book中找到更多信息。
答案 1 :(得分:4)
为此,您应该使用$belongsTo
代替hasOne
关系。
public $belongsTo = array(
'Contact' => array(
'className' => 'Contact',
'foreignKey' => 'contact_id', // check this
'conditions' => '',
'fields' => '',
'order' => '',
'counterCache' => true
)
);
答案 2 :(得分:1)
hasOne
和belongsTo
关联相似,但不一样。为了说明差异,请考虑以下模式:
users
id (int)
name (string)
addresses
id (int)
user_id (int)
is_home (bool)
... other fields ...
使用User
和Address
型号。假设每个用户只有一个“主页”地址,但用户可以创建多个地址记录。
belongsTo
表示该表中有一个外键字段(addresses.user_id
)has*
关联表示其他表具有外键(没有) users.address_id
,用户不属于地址)。
总之,这些陈述将描述模型关联: