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的盘问关联功效怎么用的详细内容,更多请关注本网内其它相关文章!