数字化技能提升教程,数字化时代生存宝典

数字化百科 / 词条 / ThinkPHP开发指南-关联模型之关联查询

ThinkPHP开发指南-关联模型之关联查询

查看全部词条命名空间:Main

导航:上一页

由于性能问题,新版取消了自动关联查询机制,而统一使用relation方法进行关联操作,relation方法不但可以启用关联还可以控制局部关联操作,实现了关联操作一切尽在掌握之中。

PHP代码


$User = D("User");

$user = $User->realtion(true)->find(1);

输出$user结果可能是类似于下面的数据:

PHP代码


array(

'id' => 1,

'account' => 'ThinkPHP',

'password' => '123456',

'Profile' => array(

'email' =>'liu21st@gmail.com',

'nickname' =>'流年',

),

)

我们可以看到,用户的关联数据已经被映射到数据对象的属性里面了。其中Profile就是关联定义的mapping_name属性。如果我们按照下面的凡事定义了as_fields属性的话,

PHP代码


protected $_link = array(

'profile'=>array(

'mapping_type' =>HAS_ONE,

'class_name' =>'Profile',

'foreign_key'=>'userId',

'as_fields'=>'email,nickname',

),

);

查询的结果就变成了下面的结果 :

array(

'id' => 1,

'account' => 'ThinkPHP',

'password' => 'name',

'email' =>'liu21st@gmail.com',

'nickname' =>'流年',

)


email和nickname两个字段已经作为user数据对象的字段来显示了。如果关联数据的字段名和当前数据对象的字段有冲突的话,怎么解决呢?我们可以用下面的方式来变化下定义:

PHP代码


'as_fields'=>'email,nickname:username',

表示关联表的nickname字段映射成当前数据对象的username字段。默认会把所有定义的关联数据都查询出来,有时候我们并不希望这样,就可以给relation方法传入参数来控制要关联查询的。

PHP代码


$User = D("User");

$user = $User->relation('Profile')->find(1);

关联查询一样可以支持select方法,如果要查询多个数据,并同时获取相应的关联数据,可以改成:

PHP代码


$User = D("User");

$list = $User->relation(true)->Select();

如果希望在完成的查询基础之上 再进行关联数据的查询,可以使用

PHP代码


$User = D("User");

$user = $User->find(1);

// 表示对当前查询的数据对象进行关联数据获取

PHP代码


$profile = $User->relationGet("Profile");

事实上,除了当前的参考模型User外,其他的关联模型是不需要创建的。

category:ThinkPHP