yii2.0表关联查询实例分析

本文阐述了在yii2.0表关联查询的方法,分享给您参考,如下:

你可以使用ActiveRecord做关联查询(例如,读取数据从一个表时,阅读相关的B表数据)。在活动记录,获取相关数据可以简单访问属性主表的ActiveRecord对象(财产)。

例如,通过适当的关系声明,您可以使用$客户机>订单获取订单对象数组,表示该客户下的订单。

声明一个关系(关系),定义一个getter方法,它返回一个Yii activequery DB对象,上下文相关的信息,因此,它将查询只有合格的相关数据。例如:


一流的客户延伸 ActiveRecord Yii分贝
{
公共功能getorders()
{
has_many / /客户订单通过order.customer_id -> ID
返回这个->有(顺序::类名),({ 'customer_id ' = 'id' });
}
}
课堂秩序扩展一 DB ActiveRecord
{
has_one / /订单客户通过customer.id -> customer_id
公共功能getcustomer()
{
返回这个->具(客户::类名),({ 'id' = 'customer_id});
}
}




Yii ActiveRecord:DB,有()和Yii DB ActiveRecord::有一个()在上面的代码被用来模拟一对多和一对一的关系,在关系数据库中。例如,一个客户有多个订单,以及订单拥有或属于一个用户。两方法接收两个参数并返回一个Yii activequery对象数据库:

$类关联模型的类名。

这两个表的链接之间的关联:美元列。这是一个数组,数组元素的关键是对应的美元类表的列名称,以及数组元素的值是当前声明类的列的名称。这是一个很好的编程实践来定义基于外部密钥关联关系。

完成上述声明后,可以通过定义相应的吸气剂方法作为访问对象属性来获得相关数据。


客户的订单
客户:客户:美元=找到(1);
$订单= $客户>订单;$订单是一个订单对象数组




上面的代码实际上执行以下两个SQL查询,分别对应于上面两行代码:


从id = 1的客户中选择*;
SELECT * FROM命令在customer_id = 1;




提示:如果你拜访客户->美元订单又不重复上述第二行的SQL查询,查询语句执行时,首先访问表达。后续访问将直接返回到内部缓冲区的数据。如果你想重新执行查询,你只需要调用unset第一清除缓存:


unset($客户->订单);。




有时,你可能想通过参数关联的查询的查询条件的限制。例如,只想看一个以上的特定量的大订单,不是所有的订单。为此,你可以使用以下的getter方法声明一个观鸟者的关系:


一流的客户延伸 ActiveRecord Yii分贝
{
公共功能getbirders($阈值= 100)
{
返回这个->有(顺序::类名),({ 'customer_id ' = 'id' })
>,('subtotal >:阈值:阈值,= > {$阈值})
-> OrderBy('id');
}
}




记住,有()返回的对象是一个Yii activequery dB,所以activequery方法可用于自定义相关的查询。

通过上面的陈述,如果你拜访客户->美元的观鸟者,它将只返回超过100个订单。如果你想指定一个不同的限制,使用下面的代码:


美元美元订单=客户-> getbirders(200)->所有();




注:联想方法返回一个Yii activequery数据库实例。如果你访问它的属性的方式(财产等),返回的数据是一个Yii ActiveRecord数据库实例,或是数组或空。例如,$客户-> getorders()返回一个activequery例如,美元和客户->命令返回一个对象数组(或者,如果查询结果为空空数组,)。

中间表关联查询

有时候,一些数据表与中间表的关联(数据透视表)。为了将这种关系,我们可以通过调用它的通过自定义Yii activequery数据库对象()()或()方法viatable。

例如,如果顺序表和商品表项的连接表order_item有关,我们可以宣布项目关系在订单班如下:


课堂秩序扩展一 DB ActiveRecord
{
公共职能getItems()
{
返回这个->者(项目::类名),({ 'id' = 'item_id})
-> viatable('order_item,{ 'order_id ' = 'id' });
}
}




通过()方法类似,但viatable()的第一个参数是一个关系(关系)在当前的ActiveRecord类中声明的名字,而不是中间的表的名称。例如,上述关系也可以用下面的方法声明:


课堂秩序扩展一 DB ActiveRecord
{
公共功能getorderitems()
{
返回这个->有(订单明细::类名),({ 'order_id ' = 'id' });
}
公共职能getItems()
{
返回这个->者(项目::类名),({ 'id' = 'item_id})
->通过('orderitems);
}
}




更多关于Yii相关内容感兴趣的读者可以查看主题:Yii框架介绍和常用的技术,总结优良的PHP开发框架

希望本文有助于基于Yii框架的PHP程序设计人。