2016-10-05 5 views
0

У меня есть две таблицы, cities и towns.Запросить две таблицы и объединить результаты на основе created_at

Что мне нужно сделать, это запросить эти две таблицы, объединить их результаты и упорядочить их по столбцам created_at. Кроме того, мне нужно ограничить его до 25 результатов. Мне также нужно как-то отличить, какая запись принадлежит cities и принадлежит towns, когда вы их показываете на мой взгляд.

Это то, что у меня есть на данный момент, но я не думаю, что это правильный способ сделать это:

$cities = City::orderBy('created_at', 'DESC') 
    ->get(); 

$towns = Town::orderBy('created_at', 'DESC') 
    ->get(); 

$results = array_merge($cities->toArray(), $towns->toArray()); 
usort($results, function($a, $b) 
{ 
    return $a['created_at'] < $b['created_at']; 
}); 

return $results; 

Проблема с этим состоит в том, что она не ограничивает его в общей сложности 25 результатов. Я также не уверен, что это лучший способ сделать это.

Вторая проблема, которую мне нужно решить, - показать результаты на моем представлении. Мне нужен способ отличить, какая запись принадлежит той таблице.

На мой взгляд, у меня есть что-то вроде:

@foreach ($results as $result) 
    @if (CHECK IF RESULT IS CITY) 

    @else (CHECK IF RESULT IS TOWN) 

    @endif 
@endforeach 

Как я могу проверить, какая запись принадлежит к какой таблице?

+0

Есть ли какое-либо отношение между городом и городом? – prateekkathal

+0

Единственное отношение состоит в том, что стол «города» имеет столбец «city_id», если город близок или находится в более крупном городе. –

ответ

0

объединить результаты сбора 2 затем заказать их по дате descendigly затем принять 25

$cities = City::orderBy('created_at', 'DESC') 
    ->get(); 

$towns = Town::orderBy('created_at', 'DESC') 
    ->get(); 
$merged = $cities->merge($towns); 

затем сортировать их

$sorted = $collection->sortByDesc('created_at');

, наконец, принять 25

$results = $sorted->take(25); 

если вы хотите чтобы узнать, какая модель объекта, вы можете использовать родной is_afunction

@foreach ($results as $result) 
    @if (is_a($result, \App\City::class)) 

    @else (is_a($result, \App\Town::class)) 

    @endif 
@endforeach 
0

Я уверен, если это будет работать или нет, потому что я не проверял, но я чувствую, что должен

$cities = City::orderBy('id', 'desc')->limit(25)->get(); 

$towns = Town::orderBy('id', 'desc')->limit(25)->get(); 

$citiesAndTowns = $cities->merge($towns)->sortByDesc('created_at')->take(25); 

// or use sortBy('created_at') for ascending.... 

Теперь в окне вы можете просто сделать это таким образом. ..

@foreach($citiesAndTowns as $cityOrTown) 
    @if(get_class($cityOrTown) == 'App\City') 

    @else 

    @endif 
@endforeach 

Или пропустить этот грязный способ делать вещи, вы можете сделать $citiesAndTowns->toArray() и внести изменения в представлении, как это ...

@foreach($citiesAndTowns as $cityOrTown) 
    // Since `city_id` will never be a part of city table and even if 
    // it is null in Town, it will still be set.... 
    @if(isset($cityOrTown['city_id'])) 

    @else 

    @endif 
@endforeach 
Смежные вопросы