0
votes

The picture below is my sample database and I want to query record which do not have the same date_received as date_released and time_received as time_released.

enter image description here

The following MySQL query works exactly what I want:

SELECT * FROM `dts_track` where  date_received != date_released and time_received != time_released

This is my Yii2 active record query so far, but it returns all records from the database:

$unit_received = \common\models\dts\DtsTrack::find()->where(['!=', 'dts_track.date_received', 'dts_track.date_released'])->andWhere(['!=', 'dts_track.time_received', 'dts_track.time_released']);
1

1 Answers

2
votes

When you're using array syntax for != condition, third element of array is treated as value, so it will be escaped as a value. So you're actually creating conditions like date_received != 'date_released' - comparing to static string instead of column value. You should either use yii\db\Expression():

$unit_received = \common\models\dts\DtsTrack::find()
    ->where(['!=', 'dts_track.date_received', new Expression('dts_track.date_released')])
    ->andWhere(['!=', 'dts_track.time_received', new Expression('dts_track.time_released')]);

Or avoid array syntax completely:

$unit_received = \common\models\dts\DtsTrack::find()
    ->where('date_received != date_released')
    ->andWhere('time_received != time_released');