2016-05-31 17 views
0

Ich versuche, ein Online-Verzeichnis zu erstellen, wo zum Beispiel Menschen die Website durchsuchen und alle Takeaways, die einen bestimmten Typ haben, finden können. Zum Beispiel:Laravel 5 Eloquent - WhereIn auf Join-Tabelle

"Indian",

"Chinese"

etc ..

Ich habe 3 Tabellen:

Geschäft

Schlagwörter

Wirtschaft Tags

Und mein Modell ist wie folgt:

class Business extends Model 
{ 
    protected $table = 'businesses'; 

    protected $fillable = [ 
     'business_name', 'postcode' 
    ]; 

    public function tags() 
    { 
     return $this->belongsToMany('App\Tags'); 
    } 
} 

Das Problem ist, wenn ich gekommen, um die Suche zu tun, und versuchen, eine whereIn das Problem ist zu tun, dass es für immer zu laden, in der Tat nimmt, es doesn lade nicht einmal. Zum Beispiel:

$business = Business::whereHas('tags', function($tag) use ($request) { 

    if($request->get('terms')) 
    { 
     $tag->whereIn('tags.name', ['chinese']); 
    } 

})->get(); 

So ist meine Frage:

Ich habe nur über 10k Reihen in der Tabelle gespeicherten Daten. Diese Tabelle ist in drei "Business", "Tags", "Business Tags" unterteilt. Das Verfahren, das wird so lange dauert zu vollenden, wahrscheinlich, weil ich die whereHas('tags') und whereIn daher verwenden, wie gehe ich über die folgende Syntax verwenden:

$business = Business::where(function ($business) use ($request) { 

    // Search for businesses with a specific tag, passed from request 

}); 

Ist das möglich?

Antwort

1

Ich bin nur wilde hier zu raten, sondern versuchen, die Bedingung außerhalb der Funktion zu ziehen und nicht angeben, den Namen der Tabelle:

if($request->get('terms')) 
    { 
     $business = Business::whereHas('tags', function($tag) use ($request) { 
      $tag->whereIn('name', ['chinese']); 
     })->get(); 
    } 
+0

Wenn dies nicht funktioniert, sollten Sie alle looping Ihre Tagnamen und die Verwendung von ** orWhere ** anstelle von ** whereIn **: '$ tag-> wo ('name', 'chinesisch') -> oderWobei ('name', 'wert');' – TheFallen

+0

Ich habe es versucht Um dies zu tun, dauert es über 2 Minuten, um etwas zu finden. Es gibt 7-10k Datensätze in der Datenbank, die meisten, wenn nicht alle von ihnen haben zwischen 1-2 Tags sind 25k Tags für alle Unternehmen gespeichert - Irgendwelche Ideen? – Phorce

+0

Haben Sie einen Index in Ihrer SQL-Beziehung zwischen einem Geschäft und einem Tag? – TheFallen