Область запроса Laravel с несколькими предложениями where возвращает неверные данные - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть таблица ниже consols:

Schema::create('consols', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->double('current_weight', 8, 3)->default(0);
    $table->double('current_weight', 8, 3)->default(0);
    $table->double('final_weight', 8, 3)->default(0);
    $table->double('final_cbm', 8, 3)->default(0);    
    $table->timestamp('finals_sent', 0)->nullable();
});

, в которой есть запись, подобная приведенной ниже:

id | current_weight | current_cbm | final_weight | final_cbm | finals_sent         |
-----------------------------------------------------------------------------------|
1  | 45.000         | 1.000       | 200.000      | 10.000    | 2019-09-26 10:03:59 |

Я написал область действия на моей модели Consol для фильтрациизаписи, где: finals_sent не является нулевым, current_weight > final_weight ИЛИ current_cbm > final_cbm:

public function scopeOfCurrentGreaterThanFinals($query)
{
    return $query->whereNotNull('finals_sent')->where(function ($query) {
        $query->where('current_weight', '>', 'final_weight')
            ->orWhere('current_cbm', '>', 'final_cbm');
    });

}

Когда я использую его и выгружаю - я ожидаю увидеть нет результаты:

$consols = Consol::ofCurrentGreaterThanFinals()
           ->orderBy('awb', 'DESC')
           ->get()
           ->toArray();

Тем не менее, приведенная выше запись все еще отображается:

array:1 [▼
  0 => array:24 [▼
    "id" => 1
    "current_weight" => 45.0
    "current_cbm" => 1.0
    "final_weight" => 200.0
    "final_cbm" => 10.0
    "finals_sent" => "2019-09-26 10:03:59"
  ]
]

Я не уверен, что я делаю неправильно?Я думаю, я ясно заявляю, что я хочу видеть только результаты, где:

  • current_weight> final_weight или
  • current_cbm> current_weight и
  • finals_sent не равен нулю

И вышеприведенная запись не подходит под это, потому что current_weight и current_cbm явно не выше, чем final_weight и final_cbm.

Чтоя делаю не так?

1 Ответ

1 голос
/ 26 сентября 2019

Ах, хорошо, вот в чем проблема.Чтобы сравнить два столбца, вы должны использовать whereRaw(), поскольку where для второго параметра ожидает значение, а не столбец.Так что это должно работать, я проверил с вашей базой данных и значениями.

return $query->whereNotNull('finals_sent')->where(function ($q) {
            $q->whereRaw('current_weight > final_weight')
                ->orWhereRaw('current_cbm > final_cbm');
        });
...