yii2数据表模型类AR--连接查询
JOIN 类型关联查询
使用关系数据库时,普遍要做的是连接多个表并明确地运用各种 JOIN 查询。 JOIN SQL语句的查询条件和参数,使用 yii\db\ActiveQuery::joinWith() 可以重用已定义关系并调用 而不是使用 yii\db\ActiveQuery::join() 来实现目标。
// 查找所有订单并以客户 ID 和订单 ID 排序,并贪婪加载 "customer" 表
$orders = Order::find()->joinWith('customer')->orderBy('customer.id, order.id')->all();
// 查找包括书籍的所有订单,并以 `INNER JOIN` 的连接方式即时加载 "books" 表
$orders = Order::find()->innerJoinWith('books')->all();
以上,方法 innerJoinWith() 是访问 INNER JOIN 类型的 joinWith() 的快捷方式。
可以连接一个或多个关联关系,可以自由使用查询条件到关联查询, 也可以嵌套连接关联查询。如:
// 连接多重关系
// 找出24小时内注册客户包含书籍的订单
$orders = Order::find()->innerJoinWith([
'books',
'customer' => function ($query) {
$query->where('customer.created_at > ' . (time() - 24 * 3600));
}
])->all();
// 连接嵌套关系:连接 books 表及其 author 列
$orders = Order::find()->joinWith('books.author')->all();
代码背后, Yii 先执行一条 JOIN SQL 语句把满足 JOIN SQL 语句查询条件的主要模型查出, 然后为每个关系执行一条查询语句, bing填充相应的关联记录。
joinWith() 和 yii\db\ActiveQuery::with() 的区别是 前者连接主模型类和关联模型类的数据表来检索主模型, 而后者只查询和检索主模型类。 检索主模型
由于这个区别,你可以应用只针对一条 JOIN SQL 语句起效的查询条件。 如,通过关联模型的查询条件过滤主模型,如前例, 可以使用关联表的列来挑选主模型数据,
当使用 joinWith() 方法时可以响应没有歧义的列名。 In the above examples, we use item.id and order.id to disambiguate the id column references 因为订单表和项目表都包括 id 列。
当连接关联关系时,关联关系默认使用即时加载。你可以 通过传参数 $eagerLoading 来决定在指定关联查询中是否使用即时加载。
默认 joinWith() 使用左连接来连接关联表。 你也可以传 $joinType 参数来定制连接类型。 你也可以使用 innerJoinWith()。
以下是 INNER JOIN 的简短例子:
// 查找包括书籍的所有订单,但 "books" 表不使用即时加载
$orders = Order::find()->innerJoinWith('books', false)->all();
// 等价于:
$orders = Order::find()->joinWith('books', false, 'INNER JOIN')->all();
有时连接两个表时,需要在关联查询的 ON 部分指定额外条件。 这可以通过调用 yii\db\ActiveQuery::onCondition() 方法实现:
class User extends ActiveRecord
{
public function getBooks()
{
return $this->hasMany(Item::className(), ['owner_id' => 'id'])->onCondition(['category_id' => 1]);
}
}
在上面, yii\db\ActiveRecord::hasMany() 方法回传了一个 yii\db\ActiveQuery 对象, 当你用 joinWith() 执行一条查询时,取决于正被调用的是哪个 onCondition(), 返回 category_id 为 1 的 items
当你用 joinWith() 进行一次查询时,“on-condition”条件会被放置在相应查询语句的 ON 部分, 如:
// SELECT user.* FROM user LEFT JOIN item ON item.owner_id=user.id AND category_id=1
// SELECT * FROM item WHERE owner_id IN (...) AND category_id=1
$users = User::find()->joinWith('books')->all();
注意:如果通过 yii\db\ActiveQuery::with() 进行贪婪加载或使用惰性加载的话,则 on 条件会被放置在对应 SQL语句的 WHERE 部分。 因为,此时此处并没有发生 JOIN 查询。比如:
// SELECT * FROM user WHERE id=10
$user = User::findOne(10);
// SELECT * FROM item WHERE owner_id=10 AND category_id=1
$books = $user->books;
关联表操作
AR 提供了下面两个方法用来建立和解除两个关联对象之间的关系:
yii\db\ActiveRecord::link()
yii\db\ActiveRecord::unlink()
例如,给定一个customer和order对象,我们可以通过下面的代码使得customer对象拥有order对象:
$customer = Customer::findOne(1);
$order = new Order();
$order->subtotal = 100;
$customer->link('orders', $order);
yii\db\ActiveRecord::link() 调用上述将设置 customer_id 的顺序是 $customer 的主键值,然后调用 yii\db\ActiveRecord::save() 要将顺序保存到数据库中。
美景欣赏


相关推荐
深度学习 -- 损失函数
深度残差网络(Deep Residual Networks (ResNets))
深度学习 -- 激活函数
神经网络训练 -- 调整学习速率
生成对抗网络(GAN)改进与发展
生成对抗网络(GAN)优点与缺点
生成对抗网络(GAN)的训练
生成对抗网络(GAN)基本原理
生成模型与判别模型