2017-02-18 2 views
1

TabellenstrukturEloquent: Wie finden Sie in Textfeldern über polymorphe Beziehungen?

entity 
    id - integer 
    title - string 
    ...  

person 
    id - integer 
    name - string 
    ... 

customers 
    id - integer 
    body - text 
    concrete_id - integer 
    concrete_type - string 

Modelle:

class Customer extends Model 
{ 
    ... 
    public function concrete() 
    { 
     return $this->morphTo(); 
    } 
    ... 
} 

Person und Entity-Modelle haben

public function customers() 
{ 
    return $this->morphMany(Customer::class, 'concrete'); 
} 

Wie alle Kunden zu finden, wo Typ 'Einheit' ist und wo berechtigt y.title = 'abc'?

Ich versuche, so etwas tun,

$obj = Customer::whereHas(['concrete' => function($query){ 
     $query->where('title', 'like', 'foo%'); 
    }])->get(); 

aber ich habe einen Fehler:

ContextErrorException in Builder.php line 825: Warning: strpos() expects parameter 1 to be string, array given

Zum Beispiel, ich kann dies tun über native MySQL Anfrage:

SELECT * 
FROM `customers` 
LEFT JOIN `entities` ON (entities.id = customers.concrete_id) 
WHERE `concrete_type` = "entity" AND entities.title LIKE "%foo%" 

Wie macht man das über Eloquent?

Antwort

0

Sie in der richtigen Art und Weise funktioniert, versuchen Sie diesen Code:

Customer::whereHas('concrete', function ($query) { 
      $query->where('title', 'like', 'foo%') 
     })->get(); 

Oder Sie können einen anderen Weg versuchen:

Entity::has('concrete')->where('title', 'like', 'foo%')->get() 
+0

hmm, nein, das dosn't Arbeit beacause in diesem Fall konkrete Modell geben nicht definiert. Personenmodell habe keine Titelspalte. Ich brauche nur Suchtext-Kunden vom Entitätstyp. – Stanislav

+0

Ich bin interessiert :) ... update antwort –

+0

Ihre zweite Methode ist gut funktionieren. Aber das Problem ist, dass diese Lösung die Sammlung von Entity Models zurückgibt. Aber ich brauche die Sammlung des Kunden. Ich aktualisierte die Frage und fügte die Beispiellösung über native SQL-Anfrage hinzu. Schau es dir an und du verstehst das Problem besser. – Stanislav

0

schrieb die Antwort nach Ihren rohen MySQL:

Customer:: 
     ->join('entities', function($join) 
     { 
      $join->on('entities.id', '=', 'customers.concrete_id') 
       ->where('entities.title', 'like', 'foo%'); 
     }) 
     ->get(); 

ich hoffe das hilft :)

+0

Danke für das Angebot, aber diese Lösung funktioniert auch nicht richtig. Weil im Ergebnis gefunden alle Kundentypen (alle Datensätze von Kunden Tabelle und verbunden mit jedem von ihnen Entität Rekord.Sie können toSql() anstelle von get() aufrufen und schauen, dass in Anfrage fehlt allgemeine 'wo' Bedingung, um konkrete Kundentyp zu trennen.)) – Stanislav

0

Laravel unterstützt jetzt nicht 'whereHas' für 'MorphTo' Relationen.

Look laravel/framework issue 5429

Und wenn Sie wollen, was geplant ist, Sie can use BelongsToMorph relation.

ich hinzugefügt Modell Kunde:

public function entity() 
{ 
    return BelongsToMorph::build($this, Entity::class, 'concrete'); 
} 

und danach, Anfrage arbeiten als es brauchen:

Customer::whereHas('entity', function ($query) { 
     $query->where('entities.title', 'like', '%foo%'); 
    })->get()->toArray(); 
Verwandte Themen