2017-12-08 6 views
1

Ich versuche, eine erweiterte Suchoption in meiner Website mit Laravel zu implementieren. Suche durch 3 bis 4 Tabelle, um das gewünschte Ergebnis zu erhalten. Ich schrieb db query und ich bekomme das gewünschte Ergebnis als Ausgabe, aber ich muss dies zu eloquent konvertieren, und ich habe einiges davon geschrieben, aber nicht das gewünschte Ergebnis als db Abfrage erhalten. Irgendeine Idee, wie man es erreicht?Suche durch mehrere Tabelle mit Laravel eloquent

DB Abfrage

$product = DB::table('products') 
->select(['products.id', 'products.title','package.name','products.product_summary','products.description' 
    ,'package.description' 
    ,'products.min_price','products.rating_count']) 
->leftjoin('package',function($q){ 
    $q->on('products.package_id' ,'package.id'); 
}) 
->leftjoin('package_packagecategories',function($q){ 
    $q->on('package.id','package_packagecategories.package_id'); 
}) 
->leftjoin('product_categories',function($q){ 
    $q->on('package_packagecategories.category_id','product_categories.id'); 
}) 
->leftjoin('country',function($q){ 
    $q->on('products.country','country.id'); 
}) 
->where('products.status',1) 
->Where('products.title','like',"%{$string}%") 
->orWhere('products.product_summary', 'like', "%{$string}%") 
->orWhere('products.description', 'like', "%{$string}%") 
->orWhere('package.name', 'like', "%{$string}%") 
->orWhere('package.description', 'like', "%{$string}%") 
->orWhere('package.product_summary', 'like', "%{$string}%") 
->orWhere('country.name', 'like', "%{$string}%") 
->get(); 

und eloquent geschrieben, so weit für die oben db Abfrage

Product::select('id', 'title','product_summary','description','min_price','rating_count') 
        ->WhereHas('Package',function($q)use($string){ 
         $q->orWhere(DB::raw('LOWER(name->>"$.en")'),'like',"%{$string}%") 
         ->orWhere(DB::raw('LOWER(description->>"$.en")'),'like',"%{$string}%") 
         ->orWhere(DB::raw('LOWER(product_summary->>"$.en")'),'like',"%{$string}%") 
         ->orWhereHas('categories',function($subq)use($string){ 
          $subq->orWhere(DB::raw('LOWER(name->>"$.en")'),'like',"%{$string}%"); 
         }); 
        }) 
        ->WhereHas('country',function($q)use($string){ 
         $q->orWhere('name','like',"%{$string}%"); 
        }) 

Ich brauche das Ergebnis für die zweiten Code zu erhalten, wie db-Abfrage tun.

+0

Meiner Meinung nach, wenn Sie eine Suchfunktion zu machen, wird eine Menge Verarbeitung erforderlich. Wenn Sie Abfrage-Generator-Abfragen und einige unformatierte Abfragen verwenden, um eine Suchfunktionalität zu erstellen, ist diese bei einer großen Datenbank schneller als die beredte Abfrage. Wenn Sie den Grund für die Umwandlung in eine eloquente Abfrage erklären, wäre es besser. –

+0

Ich habe eine Medienbibliotheksbeziehung mit dem Produktmodell, daher kann das Abrufen des Inhalts nur eloquent erfolgen, denke ich. –

Antwort

0

schließlich einen funktionierenden Code derte zu herausgefunden ..

$product->where(function($p)use($string){$p->orWhereHas('country',function($q)use($string){ 
           $q->where('name','like',"%".strtolower($string)."%"); 
          }) 
          ->orWhere(DB::raw('LOWER(products.title)'),'like',"%".strtolower($string)."%") 
          ->orWhere(DB::raw('LOWER(products.product_summary)'),'like',"%".strtolower($string)."%") 
          ->orWhere(DB::raw('LOWER(products.description)'),'like',"%".strtolower($string)."%") 
          ->orWhereHas('categories',function($subq)use($string){ 
           $subq->where(DB::raw('LOWER(name)'),'like',"%".strtolower($string)."%"); 
          }) 
          ->orWhereHas('Package',function($subq)use($string){ 
           $subq->where(DB::raw('LOWER(name)'),'like',"%".strtolower($string)."%"); 
          }) 
          ->orWhereHas('Package',function($subq)use($string){ 
           $subq->where(DB::raw('LOWER(description)'),'like',"%".strtolower($string)."%"); 
          }) 
          ->orWhereHas('Package',function($subq)use($string){ 
           $subq->where(DB::raw('LOWER(product_summary)'),'like',"%".strtolower($string)."%"); 
          }) 
          ->orWhereHas('Package',function($subq)use($string){ 
           $subq->whereHas('categories',function($subq)use($string){ 
            $subq->where(DB::raw('LOWER(name)'),'like',"%".strtolower($string)."%"); 
           }); 
          }) 
          ->orWhereHas('Package',function($subq)use($string){ 
           $subq->whereHas('country',function($q)use($string){ 
            $q->where('country.name','like',"%".strtolower($string)."%"); 
           }); 
          }); 
         });