2017-02-16 16 views
0

Ich habe freie Tabellen: Benutzer, Buch, user_book bietetYii2 Beziehungen mit Verknüpfungstabelle

Benutzertabelle Methode hat:

public function getBooks() 
    { 
     return $this->hasMany(UserBook::className(), ['user_id' => 'id']); 
    } 

user_book Tabelle hat zwei Felder: user_id, book_id; und Methoden

public function getUser() 
    { 
     return $this->hasOne(User::className(), ['id' => 'user_id']); 
    } 

public function getBook() 
    { 
     return $this->hasOne(Book::className(), ['id' => 'book_id']); 
    } 

Tabelle Angebot haben Methode wie: getUser(), getBook(),

und jetzt möchte ich zeigen Bücher wie, welche Benutzer nicht haben. Ich versuche etwas wie

 $query = Offer::find() 
       ->with('user') 
       ->andWhere([ 
        'offer.status' => Offer::STATUS_ACTIVE, 
       ]); 

$query->andWhere(['not in', 'offer.book_id', 'user.books.book_id']); 

, aber es funktioniert nicht. Hast du ein paar Ideen, wie kann ich es schaffen?

Antwort

0

Yii2 docs, relation via junction table

In Datenbank-Modellierung, wenn die Vielzahl zwischen zwei verwandten Tabellen many-to-many ist, wird eine Verknüpfungstabelle in der Regel eingeführt. Für Beispiel können die Auftragstabelle und die Positionstabelle über eine Junction-Tabelle namens order_item in Beziehung stehen. Eine Bestellung entspricht dann mehreren Bestellpositionen, während eine Produktposition auch mehreren Bestellpositionen entspricht.

Wenn Sie solche Beziehungen deklarieren, würden Sie entweder via() oder viaTable() aufrufen, um die Junction-Tabelle anzugeben. Der Unterschied zwischen via() und viaTable() besteht darin, dass ersteres die Junction-Tabelle in Terme eines bestehenden Beziehungsnamens angibt, während Letzterer direkt die Junction-Tabelle verwendet. Zum Beispiel

class Order extends ActiveRecord 
{ 
    public function getItems() 
    { 
     return $this->hasMany(Item::className(), ['id' => 'item_id']) 
      ->viaTable('order_item', ['order_id' => 'id']); 
    } 
} 
or alternatively, 

class Order extends ActiveRecord 
{ 
    public function getOrderItems() 
    { 
     return $this->hasMany(OrderItem::className(), ['order_id' => 'id']); 
    } 

    public function getItems() 
    { 
     return $this->hasMany(Item::className(), ['id' => 'item_id']) 
      ->via('orderItems'); 
    } 
} 
+0

ok, ich habe 'public function getBooks() { return $ this-> hasMany (Buch :: classname(), [ 'id' => 'book_id']) -> viaTable ('{{% UserBooks}}', ['user_id' => 'id']); } 'aber wie Abfrage erstellen? –

+0

Sie könnten einfach 'via ('userBooks') 'verwenden - Sie haben diese Beziehung so definiert, wie ich sehen kann. Verwenden Sie in Query '-> joinWith (['books'])' 'und verwenden Sie sie dann in der Abfrage als' books.id', nicht als 'user.books.id' – Yupik

Verwandte Themen