Yii2 models - activerecord join With + and Where 日期选择

Yii2 models - active record joinWith + andWhere date selection

我喜欢select两个相关Yii2的具体相关资料models。两种模型都处于 1:n 关系中。关系很好!


订单型号:

订单模型关系定义:

/**
 * @return \yii\db\ActiveQuery
 */
public function getTimeCaptures()
{
    return $this->hasMany(TimeCapture::className(), ['orderId' => 'id']);
}

timeCapture 型号:


我想在特定日期之间获取所有 orders 相关的 timeCaptures。下面的语句会给我全部timeCapturesandWhere 子句似乎不起作用!

/**
 * 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);

抱歉回答晚了