2016-04-06 6 views
9

Ich versuche, einige einfache favoriting für meine App-Setup mit Laravel/Jenssegers MongoDBLaravel Jenssegers MongoDb Beziehungen nicht funktioniert?

Ich habe zwei Modelle:

class Item { 

    public function favorites() 
    { 
     return $this->hasMany('App\Models\User', 'favorites'); 
    } 
} 

class User { 

    public function favorites() 
    { 
     return $this->hasMany('App\Models\Item', 'favorites'); 
    } 
} 

So kann ein Element haben viele Benutzer und ein Benutzer kann viele Elemente haben oder "Favoriten".

Wenn ich versuche, eine einfache Abfrage wie auszuführen:

Item::with('favorites')->get(); 

Die Beziehung zu den Favoriten gibt es aber ein leeres Array.

Die favorites Tisch ist einfach und hat nur drei Spalten:

_id, item_id, user_id 

ich auch mit embedsMany ohne Glück versucht haben:

return $this->embedsMany('App\Models\User', 'favorites'); 

Ich habe auch jede Kombination von Parametern versucht.

return $this->embedsMany('App\Models\User', 'favorites', 'building_id', 'user_id'); 
return $this->embedsMany('App\Models\User', 'favorites', 'user_id', 'building_id'); 
return $this->hasMany('App\Models\User', 'favorites', 'building_id', 'user_id'); 
return $this->hasMany('App\Models\User', 'favorites', 'user_id', 'building_id'); 

seltsame Ergebnisse bei der Verwendung von:

return $this->hasMany('App\Models\User', 'favorites', 'building_id', 'user_id'); 

Nur in dieser Situation es alle Benutzer zurückgibt, obwohl Favoriten nur ein Datensatz hat.

Auch versucht zu debuggen mit getQueryLog gibt mir immer ein leeres Array zu jeder Zeit.

print_r(\DB::connection('mongodb')->getQueryLog()); 

Ich habe dies mit mysql getan und hatte nie Probleme. Also nicht wirklich sicher, woher die Probleme kommen.

+0

Sie müssen bedenken, dass NoSQL-Datenbanken wie MongoDB keine Beziehungen haben sollen. Das ist die Idee der NoSQL-Datenbank. Wenn Sie eine traditionelle Beziehung benötigen, sollten Sie eine traditionelle SQL-Datenbank (wie MySQL oder PostgreSQL) verwenden. – Bald

+0

Genau, wenn Sie eine hasMany-Beziehung haben, müssen Sie die gesamten Benutzerinstanzen in Item-Objekt verschachteln, zum Beispiel '{ " Benutzer ": [ {" name ":" user1 "}, {" name ":" user2 " } ] } ' –

+0

@Bald Ich denke, eloquent hat keine Joins, es 'verwendet eifrig laden. Was ist los mit dem Abrufen von Daten? Zum Beispiel wirst du das Benutzerobjekt nicht innerhalb eines Kommentars eines Posts speichern, oder? – Rob

Antwort

3

können Sie versuchen, diese stattdessen ich sein dasselbe weiß aber könnte den Trick tun: belongsTo:

use App\User; 
use App\Item; 

class Item { 

    public function favorites() 
    { 
     return $this->hasMany('User'); 
    } 
} 

class User { 

    public function favorites() 
    { 
     return $this->hasMany('Item'); 
    } 
} 

class Favourite { 

     public function users() 
     { 
      return $this->belongsTo('User'); 
     } 

     public function items() 
     { 
      return $this->belongsTo('Item'); 
     } 
    } 

Auch Umkehrung der obigen Beziehungen wie hinzuzufügen. und versuchen Sie diese Abfrage dann:

//Just for testing purpose, if raw query returns right result 
$items = DB::table('items') 
->join('favorites','items.id','=','favorites.id') 
->get();