php - Yii2加入子查询

标签 php mysql yii yii2

我正在建立一个预订网站,其中的酒店(例如酒店)有房间,您可以预订房间。

我制作了一个原始 SQL 查询,用于过滤指定日期范围内的可用房间,但我不知道如何以 YII AR 方式实现它:与事件记录一起使用 find()作为关系

大家对此有什么建议或意见吗?

SELECT
  property.id,
  property_lang.name,
  max_people.total
FROM property
  JOIN property_lang ON (property.id = property_lang.property_id AND property_lang.lang_id = 'hu')
  JOIN (
         SELECT
           property_id     AS id,
           sum(max_people) AS total
         FROM room
         WHERE room.id NOT IN (
           SELECT room_id
           FROM booking
             JOIN booking_status ON (booking.last_status_id = booking_status.id)
             JOIN booking_room ON (booking.id = booking_room.id)
             JOIN property ON booking.property_id = property.id
           WHERE (booking_status.status > -1 OR booking_status.status IS NULL)
                 AND booking.check_in < '2017-10-18'
                 AND booking.check_out > '2017-10-14'
         )
         GROUP BY property_id
       ) max_people
    ON max_people.id = property_id

ORDER BY property.id

最佳答案

最简单的解决方案是使用带参数的 createCommand:

\Yii::$app->db->createCommand("SELECT
property.id,
  property_lang.name,
  max_people.total
FROM property
  JOIN property_lang ON (property.id = property_lang.property_id AND property_lang.lang_id = 'hu')
  JOIN (
         SELECT
           property_id     AS id,
           sum(max_people) AS total
         FROM room
         WHERE room.id NOT IN (
           SELECT room_id
           FROM booking
             JOIN booking_status ON (booking.last_status_id = booking_status.id)
         JOIN booking_room ON (booking.id = booking_room.id)
         JOIN property ON booking.property_id = property.id
       WHERE (booking_status.status > -1 OR booking_status.status IS NULL)
             AND booking.check_in < ':startdate'
             AND booking.check_out > ':finishdate'
     )
     GROUP BY property_id
   ) max_people
ON max_people.id = property_id

ORDER BY property.id")
             ->bindValues([':startdate' => $startDate, ':finishdate' => $startDate])
             ->execute();

另一种方法是将查询拆分为子查询并尝试使用 AR。它会是这样的:

$subSubQuery=Booking::find()
->select(['room_id'])
->join('booking_status', 'booking.last_status_id = booking_status.id')
->join('booking_room', 'booking.id = booking_status.id')
->join('property', 'booking.property_id= booking_propery.id')
->andWhere(['or',
        ['>','booking_status.status',-1],
        [ 'booking_status.status'=>null],
])
->andWhere(['<','booking.check_in',$startDate])
->andWhere(['>','booking.checkout',$finishDate])
->groupBy('property_id');

$subQuery = Room::find()->select(['property_id as id','sum(max_people) as total'])->andFilterWhere(['not in', 'answers_metering.id', $subSubQuery]);

$query = Property::find()->select(['property.id','property_lang.name','max_people.total'])
->join($subQuery. ' as max_people', 'max_people.id = property.id')
->join('property_lang', 'property.id = property_lang.property_id AND property_lang.lang_id = \'hu\'')
->orderBy(['property.id' => SORT_ASC])
->all();

关于php - Yii2加入子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46489500/

相关文章:

php - session_start() php 中的 UnexpectedValueException 导致 SPLObjectStorage 序列化失败

mysql - 从另一个 SELECT 向表中插入行 - MySQL

php - 存储状态标志的最佳方式

php - Yii:在一个 Controller 中进行两个 ajax 验证

yii 框架 View 中的 javascript 验证电子邮件

php - Symfony - 是否可以使用网络编辑器编辑 Twig 模板

php - 将以下查询显示为逗号分隔列表

php - 如何动态访问可变多维数组中的值

php - 将 BIG mysql 表导出到 JSON

php - 从 jQuery .ajax 调用向 PHP 发送数据的问题