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 . में प्रत्येक प्रविष्टि के लिए सबक्वेरी सरणी। यदि इसे धीमा करना है, तो आप जॉइन क्वेरी का उपयोग कर सकते हैं जैसे:

$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();

यदि आप वाक्पटु का उपयोग नहीं करते हैं, तो आप "उत्सुक लोडिंग" स्वयं भी कर सकते हैं।

$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. mysql में टेबल पंक्तियों को कॉलम में बदलना

  2. mysql_fetch_array () का उपयोग करने का प्रयास करते समय मुझे केवल परिणाम का एक सेट मिल रहा है

  3. डेटाबेस परिणाम को सरणी में बदलें

  4. क्वेरी संख्या को कम करने के लिए एकाधिक क्वेरी परिणाम कैसे प्राप्त करें?

  5. Php/Mysql दिनांक '0000-00-00' के रूप में सहेजा गया