PHP Eager Loading Kullanımı - R10.net
  • 04-12-2019, 15:06:50
    #1
    Size Eager Loading nedir ve nasıl kullanılır bunu anlatmaya çalışacağım.

    Örneğin veritabanımızda 100 mağazamız ve bu mağazalara ait ürünler olsun. Biz bu dataları ekrana basarken şu hatayı yapıyoruz.

    Önce kullanıcıları çekip kullanıcıları döngüye alıp her döngüde gidip kullanıcı idsi ile ürünler tablosuna sorgu çekiyoruz. Böylece kullanıcı ve ürünlerini ekrana yazdırırken toplamda 101 sorgu çekmiş oluyoruz. Daha iyi anlamak için hatalı olan örneğimizi yapalım

    // Hatalı Örnek
    $query = $db->query('select * from shops');
    $shops = $query->fetchAll(PDO::FETCH_ASSOC);
    
    foreach ($shops as $shop){
       echo $shop['shop_name']. '<br>';
    
       $query = $db->query("select * from products where shop_id = {$shop['id']}");
       $products = $query->fetchAll(PDO::FETCH_ASSOC);
    
       foreach ($products as $product) {
          echo $product['name'].'<br>';
          }
       }
    Yukarıdaki kod sorunsuz şekilde çalışmaktadır fakat doğru bir yöntem değildir. Hadi eager loading kullanarak bunu 2 sorguda nasıl çözeriz yapalım.

    // Eager Loading Örneği
    
    $query = $db->query('select * from shops');
    $shops = $query->fetchAll(PDO::FETCH_ASSOC);
    
    $ids = [];
    
    // Bu döngüde mağazaların id lerini ids dizisine atıp daha sonra bunu string haline dönüştürüp
    // mağazaların ürünlerini çekeceğiz.
    
    foreach ($shops as $shop){
       $ids[] = (int)$shop['id'];
    }
    
    $shop_ids = implode(',', $ids);
    
    $shop_products = [];
    
    $query = $db->query("SELECT * FROM products WHERE shop_id IN ( {$shop_ids} )");
    $all_products = $query->fetchAll(PDO::FETCH_ASSOC);
    
    foreach($all_products as $product) {
       $shop_products[$product['shop_id']][] = $product;
    }
    
    
    // Eager loading ile yapılmış örneğimizi ekrana yazdırıyoruz.
    foreach ($shops as $shop) {
       echo $shop['shop_name'].'<br>';
      
       foreach ($shop_products[$shop['id']] as $product) {
          echo $product['name'].'<br>';
       }
    }
    Syke: ademozmermer
  • 04-12-2019, 15:24:30
    #2
    admozmrmr adlı üyeden alıntı
    Size Eager Loading nedir ve nasıl kullanılır bunu anlatmaya çalışacağım.

    Örneğin veritabanımızda 100 mağazamız ve bu mağazalara ait ürünler olsun. Biz bu dataları ekrana basarken şu hatayı yapıyoruz.

    Önce kullanıcıları çekip kullanıcıları döngüye alıp her döngüde gidip kullanıcı idsi ile ürünler tablosuna sorgu çekiyoruz. Böylece kullanıcı ve ürünlerini ekrana yazdırırken toplamda 101 sorgu çekmiş oluyoruz. Daha iyi anlamak için hatalı olan örneğimizi yapalım

    // Hatalı Örnek
    $query = $db->query('select * from shops');
    $shops = $query->fetchAll(PDO::FETCH_ASSOC);
    
    foreach ($shops as $shop){
       echo $shop['shop_name']. '<br>';
    
       $query = $db->query("select * from products where shop_id = {$shop['id']}");
       $products = $query->fetchAll(PDO::FETCH_ASSOC);
    
       foreach ($products as $product) {
          echo $product['name'].'<br>';
          }
       }
    Yukarıdaki kod sorunsuz şekilde çalışmaktadır fakat doğru bir yöntem değildir. Hadi eager loading kullanarak bunu 2 sorguda nasıl çözeriz yapalım.

    // Eager Loading Örneği
    
    $query = $db->query('select * from shops');
    $shops = $query->fetchAll(PDO::FETCH_ASSOC);
    
    $ids = [];
    
    // Bu döngüde mağazaların id lerini ids dizisine atıp daha sonra bunu string haline dönüştürüp
    // mağazaların ürünlerini çekeceğiz.
    
    foreach ($shops as $shop){
       $ids[] = (int)$shop['id'];
    }
    
    $shop_ids = implode(',', $ids);
    
    $shop_products = [];
    
    $query = $db->query("SELECT * FROM products WHERE shop_id IN ( {$shop_ids} )");
    $all_products = $query->fetchAll(PDO::FETCH_ASSOC);
    
    foreach($all_products as $product) {
       $shop_products[$product['shop_id']][] = $product;
    }
    
    
    // Eager loading ile yapılmış örneğimizi ekrana yazdırıyoruz.
    foreach ($shops as $shop) {
       echo $shop['shop_name'].'<br>';
      
       foreach ($shop_products[$shop['id']] as $product) {
          echo $product['name'].'<br>';
       }
    }
    Neden LEFT JOIN ile cozmuyoruz?