mysql – cakePHP hasOne为空
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – cakePHP hasOne为空,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4963字,纯文字阅读大概需要8分钟。
内容图文
![mysql – cakePHP hasOne为空](/upload/InfoBanner/zyjiaocheng/900/89f4775c217d4421b1ec3da688767baf.jpg)
我是CakePHP的新手,我有一个关系问题.
我的模型看起来像这样:
<?
class Operator extends AppModel
{
var $name = 'Operator';
var $hasOne = array('Contact','Adress','Land');
}
?>
和我的表看起来像这样:
CREATE TABLE `operators` (
`id` varchar(45) NOT NULL,
`name` int(11) NOT NULL,
`adress_id` int(11) NOT NULL,
`land_id` int(11) NOT NULL,
`contact_id` int(11) NOT NULL,
`operator_category_id` int(11) NOT NULL,
`legal_form` varchar(45) DEFAULT NULL,
`affidavit` varchar(45) DEFAULT NULL,
`comment` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
KEY `operator_category_fk_idx` (`operator_category_id`),
KEY `contact_id_idx` (`contact_id`),
KEY `adress_id_idx` (`adress_id`),
KEY `land_id_idx` (`land_id`),
CONSTRAINT `adress_id` FOREIGN KEY (`adress_id`) REFERENCES `adresses` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `contact_id` FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `land_id` FOREIGN KEY (`land_id`) REFERENCES `lands` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `operator_category_fk` FOREIGN KEY (`operator_category_id`) REFERENCES `operator_category` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)
但cakePHP不显示任何数据,例如往来
我究竟做错了什么?
解决方法:
hasOne关系仅在您具有1对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') ;
}
获取运算符条目时,您将获得以下内容:
Array(
[Operator] => Array
(
[id] => 42,
[name] => 'operator',
[contact_id] => 33
)
[Contact] => Array
(
[id] => 33,
[name] => 'contact'
)
)
hasOne和hasMany
由于您的操作符属于联系人,您的联系人有一个或多个操作符.让我们来说明两者之间的区别:
>您的每个联系人条目仅与一个操作符相关联,您可以在联系人模型中添加operator_id外键,但这将是多余的,因为您已在操作符中使用contact_id进行关联.因此,您要做的是在Contact模型中创建一个hasOne关联,因此请联系hasOne Operator.
class Contact extends AppModel {
public $hasOne = array('Operator') ;
}
同样,在获取联系人条目时,您将获得:
Array(
[Contact] => Array
(
[id] => 33,
[name] => 'contact'
)
[Operator] => Array
(
[id] => 42,
[name] => 'operator',
[contact_id] => 33
)
)
请注意,这与使用belongsTo Contact编写运算符时相同. hasOne和belongsTo之间的区别主要是哪个模型有一个指向另一个的外键.
>您的联系人条目的Eah与多个(多个)操作符相关联,在这种情况下,您的联系人hasMany操作符.
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
)
)
)
hasAndBelongsToMany
现在,假设一个操作符可以有多个联系人,一个联系人可以为多个操作符服务.在这种情况下,您需要一个额外的表(如果您遵循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字段.
完整的例子
假设我有以下模型:公司,员工,地址和以下约束:
>公司有各种员工,但只有一名CEO是员工的一部分
>公司有一个地址,每个地址最多只有一家公司
您有以下表格:
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)
) ;
请注意,在这种情况下,您不能具有所有约束的表,因为您在公司和员工之间有一个循环,您需要在之后添加约束.
以下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_id,我就有公司所属地址和地址hasOne公司.我在这里做了一个随意的选择,在一个真实的应用程序中你应该想到上面两个案例中哪一个是最有意义的.
还要注意我定义模型的方式,没有什么可以阻止员工成为公司的CEO而不是自己的员工.
您可以在the CakePHP 2.x Book中找到更多信息.
内容总结
以上是互联网集市为您收集整理的mysql – cakePHP hasOne为空全部内容,希望文章能够帮你解决mysql – cakePHP hasOne为空所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。