2016-06-07 3 views
0

Я строю систему отчетности, в которую я импортирую на ежедневной основе множество файлов в мою базу данных. Возникла проблема: у меня могут быть дубликаты, но действительные записи в моей базе данных.Laravel Eloquent; Показать самую последнюю запись с поиском LIKE

В моей базе данных У меня был бы следующий, пример, набор данных.

ID  NAME   MATERIAL  PRICE  CREATED_AT 
1   Foo   FP1234  3.45   2016-01-01 15:00:00 
2   Bar   FP8177  7.21   2016-01-01 15:00:00 
3   Foo   FP1234  4.87   2016-01-02 15:00:00 
4   Baz   FP1231  3.00   2016-01-02 15:00:00 

Я хотел бы знать, как я могу вернуть выше результирующий набор, но исключает row 1потому это то же самое, как row 3 и row 3 более свежо. Добавляя к моим аргументам, row 1 и 3 те же, но так как row 3 имеет более позднюю отметку created_at, я бы хотел только увидеть это.

Сложная вещь: мне нужно иметь возможность разбивать на нее сверху, а использование метода Laravel Collection forPage - это то, чего я надеялся избежать.

Моя проблема

я могу использовать Laravel OrderBy и GroupBy при выполнении поиска с равным слишком операнде, однако мне нужно учитывать как, а также.

ответ

1

Вы можете использовать подзапросы для получения заказанного набора данных для выполнения других функций.

Одно решение (я не знаю вашего TABLENAME, или то, что ваш LIKE переменную ($ queryTerm) передается в качестве):

DB::table('tableName')->whereIn('tableName.id', function($subquery) { 
    $subquery->select('tableName.id') 
     ->from('tableName') 
     ->orderBy('created_at','DESC'); 
}) 
->where('tableName.column', 'LIKE', '%' .$queryTerm. '%') 
->where('tableName.column', '=', $anotherQueryTerm) 
->groupBy('tableName.MATERIAL') 
->get(); 

Точно такой же будет работать с красноречив, поскольку Eloquent использует Query Builder внизу для создания запросов к базе данных:

SomeModel::whereIn('tableName.id', function($subquery) { 
    $subquery->select('tableName.id') 
     ->from('tableName') 
     ->orderBy('created_at','DESC'); 
}) 
->where('tableName.column', 'LIKE', '%' .$queryTerm. '%') 
->where('tableName.column', '=', $anotherQueryTerm) 
->groupBy('tableName.MATERIAL') 
->get(); 
+1

Спасибо, Джастин! Я дам это тому назад и дам вам знать :-) –

+1

Это сработало, спасибо! –

+0

Не беспокойтесь! Спасибо за ответ! –

Смежные вопросы