Mysql
 sql >> база данни >  >> RDS >> Mysql

Красноречиво при което с обединяване на множество таблици

Обърнете внимание, че начинът, по който се опитвате да го направите, може да получите няколко реда на елемент (по веднъж на свързан списък). По-добър начин би бил да имате масив от обяви за всеки артикул.

Ако използвате красноречиви модели и сте настроили връзките правилно, можете да опитате следното:

$cats = [1, 2, 3];

$query = Item::with('listings');
foreach ($cats as $cat) {
    $query->whereHas('catitems', function($q) use($cat) {
        $q->where('id', $cat);
    });
}
$items = $query->get();

Сега всеки артикул трябва да има listings Имот. Например за първия артикул можете да получите достъп до списъците по следния начин:

$item1 = $items[0];
$listings1 = $item1->listings;

Обърнете внимание, че whereHas() вероятно ще създаде корелирани EXISTS подзаявка за всеки запис в $cats масив. Ако това ще се забави, можете да използвате JOIN заявка като:

$items = Item::with('listings')
    ->join('catitem_item', 'catitem_item.item_id', '=', 'items.id')
    ->whereIn('catitem_item.catitem_id', $cats)
    ->groupBy('items.id')
    ->having(DB::raw('count(*)'), '=', count($cats))
    ->select('items.*')
    ->get();

Ако не използвате eloquent, можете сами да направите „нетърпеливото зареждане“.

$items = DB::table('items')
    ->join('catitem_item', 'catitem_item.item_id', '=', 'items.id')
    ->whereIn('catitem_item.catitem_id', $cats)
    ->groupBy('items.id')
    ->having(DB::raw('count(*)'), '=', count($cats))
    ->select('items.*')
    ->get()
    ->keyBy('id');

foreach ($items as $item) {
    $item->listings = [];
}

$itemIds = $items->pluck('id');
$listings = DB::table('listings')
    ->join('item_listing', 'item_listing.listing_id', '=', 'listings.id')
    ->whereIn('item_listing.item_id', $itemIds)
    ->groupBy('listings.id')
    ->select('listings.*', DB::raw('group_concat(item_listing.item_id) as item_ids'))
    ->get();

foreach ($listings as $listing) {
    $itemIds = explode(',', $listing->item_ids);
    foreach ($itemIds as $itemId) {
        $items[$itemId]->listings[] = $listing;
    }
    $listing->forget('item_ids');
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. използвайте КЛАУЗА WHERE за данни за търсене от дата А до дата Б

  2. Bind е NULL или NULL, когато използвате PHP PDO и MySql

  3. Групиране по ден от времеви печат

  4. Неправилна стойност за дата и час при настройка на Django с MySQL

  5. Историзация на база данни