Yii2 models - activerecord join With + and Where 日期选择
Yii2 models - active record joinWith + andWhere date selection
我喜欢select两个相关Yii2的具体相关资料models
。两种模型都处于 1:n
关系中。关系很好!
订单型号:
- @属性 整数 $id
订单模型关系定义:
/**
* @return \yii\db\ActiveQuery
*/
public function getTimeCaptures()
{
return $this->hasMany(TimeCapture::className(), ['orderId' => 'id']);
}
timeCapture 型号:
- @属性 整数 $id
- @属性 整数 $orderId
- @属性 字符串 $date(它在 MySQL-DB 中的
Datetime
)
我想在特定日期之间获取所有 orders
相关的 timeCaptures
。下面的语句会给我全部timeCaptures
。 andWhere
子句似乎不起作用!
/**
* Build query
*/
$orders = Order::find()
->joinWith('timeCaptures')
->andWhere([
'>=',
'timeCapture.date',
$startDateSearch->format('Y-m-d H:i:s')
])
->andWhere([
'<=',
'timeCapture.date',
$endDateSearch->format('Y-m-d H:i:s')
])->all();
这是 $orders->createCommand()->getRawSql()
:
的原始 SQL 输出
SELECT `order`.*
FROM `order`
LEFT JOIN `timeCapture` ON `order`.`id` = `timeCapture`.`orderId`
WHERE (`timeCapture`.`date` >= '2017-02-01 00:00:00')
AND (`timeCapture`.`date` <= '2017-02-28 00:00:00')
请提供使用 Yii2 active records 的答案。提前致谢。
你试过吗?
/**
* Build query
*/
$orders = Order::find()
->joinWith('timeCaptures')
->with('timeCaptures') // this is what you should add
->andWhere([
'>=',
'timeCapture.date',
$startDateSearch->format('Y-m-d H:i:s')
])
->andWhere([
'<=',
'timeCapture.date',
$endDateSearch->format('Y-m-d H:i:s')
])->all();
我们的想法是,使用 joinWith,您将创建一个允许您对两个表进行过滤的联接,这正是您所做的。但您也可以使用预加载 http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#lazy-eager-loading 在同一查询中获取相关模型。我相信这实际上可能会创建您正在寻找的确切查询。它应该创建
SELECT `order`.*, `timeCapture`.*
FROM `order`
LEFT JOIN `timeCapture` ON `order`.`id` = `timeCapture`.`orderId`
WHERE (`timeCapture`.`date` >= '2017-02-01 00:00:00')
AND (`timeCapture`.`date` <= '2017-02-28 00:00:00')
同时在已停用的订单和 timeCapture 记录之间建立适当的关系,以便您应该能够使用
访问它们
$order->timeCaptures
如果我没猜错,这就是您要找的:
$startDateSearch = new DateTime('2017-02-10');
$endDateSearch = new DateTime('2017-02-17');
$orders = Order::find()->with([
'timeCaptures' => function (\yii\db\ActiveQuery $query) use($startDateSearch, $endDateSearch) {
$query
->andWhere([
'>=',
'timeCapture.date',
$startDateSearch->format('Y-m-d H:i:s')
])
->andWhere([
'<=',
'timeCapture.date',
$endDateSearch->format('Y-m-d H:i:s')
]);
},
])->all();
var_dump($orders);
抱歉回答晚了
我喜欢select两个相关Yii2的具体相关资料models
。两种模型都处于 1:n
关系中。关系很好!
订单型号:
- @属性 整数 $id
订单模型关系定义:
/**
* @return \yii\db\ActiveQuery
*/
public function getTimeCaptures()
{
return $this->hasMany(TimeCapture::className(), ['orderId' => 'id']);
}
timeCapture 型号:
- @属性 整数 $id
- @属性 整数 $orderId
- @属性 字符串 $date(它在 MySQL-DB 中的
Datetime
)
我想在特定日期之间获取所有 orders
相关的 timeCaptures
。下面的语句会给我全部timeCaptures
。 andWhere
子句似乎不起作用!
/**
* Build query
*/
$orders = Order::find()
->joinWith('timeCaptures')
->andWhere([
'>=',
'timeCapture.date',
$startDateSearch->format('Y-m-d H:i:s')
])
->andWhere([
'<=',
'timeCapture.date',
$endDateSearch->format('Y-m-d H:i:s')
])->all();
这是 $orders->createCommand()->getRawSql()
:
SELECT `order`.*
FROM `order`
LEFT JOIN `timeCapture` ON `order`.`id` = `timeCapture`.`orderId`
WHERE (`timeCapture`.`date` >= '2017-02-01 00:00:00')
AND (`timeCapture`.`date` <= '2017-02-28 00:00:00')
请提供使用 Yii2 active records 的答案。提前致谢。
你试过吗?
/**
* Build query
*/
$orders = Order::find()
->joinWith('timeCaptures')
->with('timeCaptures') // this is what you should add
->andWhere([
'>=',
'timeCapture.date',
$startDateSearch->format('Y-m-d H:i:s')
])
->andWhere([
'<=',
'timeCapture.date',
$endDateSearch->format('Y-m-d H:i:s')
])->all();
我们的想法是,使用 joinWith,您将创建一个允许您对两个表进行过滤的联接,这正是您所做的。但您也可以使用预加载 http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#lazy-eager-loading 在同一查询中获取相关模型。我相信这实际上可能会创建您正在寻找的确切查询。它应该创建
SELECT `order`.*, `timeCapture`.*
FROM `order`
LEFT JOIN `timeCapture` ON `order`.`id` = `timeCapture`.`orderId`
WHERE (`timeCapture`.`date` >= '2017-02-01 00:00:00')
AND (`timeCapture`.`date` <= '2017-02-28 00:00:00')
同时在已停用的订单和 timeCapture 记录之间建立适当的关系,以便您应该能够使用
访问它们$order->timeCaptures
如果我没猜错,这就是您要找的:
$startDateSearch = new DateTime('2017-02-10');
$endDateSearch = new DateTime('2017-02-17');
$orders = Order::find()->with([
'timeCaptures' => function (\yii\db\ActiveQuery $query) use($startDateSearch, $endDateSearch) {
$query
->andWhere([
'>=',
'timeCapture.date',
$startDateSearch->format('Y-m-d H:i:s')
])
->andWhere([
'<=',
'timeCapture.date',
$endDateSearch->format('Y-m-d H:i:s')
]);
},
])->all();
var_dump($orders);
抱歉回答晚了