尊龙凯时人生就是博

ThinkPHP的盘问关联功效怎么用

一. 模子关联

1.1一对一关联

一对一关联即两个数据表中各自只有一条纪录 ,这时使用hasOne()和belongTo()函数举行关联。假定我们拥有两个数据表 ,一个称为用户表(user table) ,另一个则为用户信息表(userinfo table) ,它们各自的结构如下:

user:
id
name

userinfo:
id
user_id
age

登录后复制

上面两个表是通过字段user_id举行关联的。现在我们需要在user表中盘问用户信息和对应的年岁 ,办法如下:

连忙学习“PHP免费学习条记(深入)”;

在User模子中界说一个userinfo()要领 ,要领名随意。

//User模子

<?php

class User extends Model{
public function userinfo(){
return $this -> hasOne('UserInfo', 'user_id');
}
}

登录后复制

在User模子中界说一个age()要领 ,这个要领着实是界说了一个属性 ,它会见userinfo模子的age字段。

//User模子
<?php

class User extends Model{
protected $readonly = ['age'];

public function userinfo(){
return $this -> hasOne('UserInfo', 'user_id');
}

public function getAgeAttr($value, $data){
if(isset($data['userinfo'])){
return $data['userinfo']['age'];
}
return '';
}
}

登录后复制

完成以上代码后 ,我们就可以使用find()要领盘问到我们想要的用户以及其年岁:

//盘问user表中id为1的用户

$user = User::get(1);
echo $user -> name;
echo $user -> age;

登录后复制

注重:在上面的代码中 ,我们使用了$readonly属性 ,$readonly属性是ThinkPHP提供的属性 ,他能够掩护一些属性不被写入数据库。在上面的代码中 ,我们将age属性设定为只读属性 ,这样当$user -> age被会见的时间 ,就会自动挪用getAgeAttr要领去盘问userinfo模子内里的age字段。

1.2 一对多关联

一对多关联指的是两个数据表中一个有多条纪录 ,一个只有一条纪录。如下面的例子:

order:
id
user_id
order_no

order_goods:
id
order_id
name
price

登录后复制

上面两个表是通过字段order_id关联的。我们现在要查找user表中用户的订单信息以及对应的商品信息 ,详细操作如下:

在User模子中界说一个orders()要领 ,这个要领体现一个用户有多个订单。

//User模子

<?php
class User extends Model{
public function orders(){
return $this -> hasMany('Order', 'user_id');
}
}

登录后复制

在Order模子中界说一个goods()要领 ,这个要领体现一个订单有多个商品。

//Order模子
<?php
class Order extends Model{
public function goods(){
return $this -> hasMany('OrderGoods', 'order_id');
}
}

登录后复制

界说好以上的关联后 ,我们就可以使用find()要领盘问出用户的订单以及每个订单对应的商品:

//盘问user表中id为1的用户的订单信息和订单的商品信息

$user = User::get(1, 'orders.goods');
var_dump($user -> orders[0] -> goods);

登录后复制

最后一个参数(’orders.goods’)体现同时盘问它所有的Order和Order关联的Goods信息。

二. 盘问关联

2.1 使用关联盘问

我们可以通过会见模子层中界说的关联属性 ,实现关联盘问 ,而无需在模子层级别上界说关联关系。如 ,我们现在想盘问一个用户以及它的订单信息:

$user = User::get(1);
$orders = $user -> orders;
echo $user -> name;
foreach($orders as $order){
echo $order -> order_no . "\n";
}

登录后复制

2.2 延迟关联

若是我们不想在盘问一个模子的时间自动盘问它的关联关系 ,可以使用延迟关联来实现此需求。如:

$user = User::with('orders')->get(1);

登录后复制

上面的代码中 ,我们设置$user变量时在with()函数中界说了所要获取的关联关系 ,这时盘问语句不会默认自动盘问关联关系 ,而是期待我们使用关联关系时才会盘问。

2.3 包括关联

除了上面的延迟关联外 ,我们还可以通过设置with要领后的true参数自动包括所有关联关系来实现我们的盘问需求。如:

$user = User::with('orders')->find(1, true);

登录后复制

上面的代码中 ,我们在find()要领中增添了一个true参数 ,这个参数体现我们要包括user模子的所有关联关系。

以上就是ThinkPHP的盘问关联功效怎么用的详细内容 ,更多请关注本网内其它相关文章!

免责说明:以上展示内容泉源于相助媒体、企业机构、网友提供或网络网络整理 ,版权争议与本站无关 ,文章涉及看法与看法不代表尊龙凯时人生就是博滤油机网官方态度 ,请读者仅做参考。本文接待转载 ,转载请说明来由。若您以为本文侵占了您的版权信息 ,或您发明该内容有任何涉及有违公德、冒犯执法等违法信息 ,请您连忙联系尊龙凯时人生就是博实时修正或删除。

相关新闻

联系尊龙凯时人生就是博

13452372176

可微信在线咨询

事情时间:周一至周五 ,9:30-18:30 ,节沐日休息

QR code
sitemap网站地图