2017-02-16 1 views
0

I ont des tables libres: mode, livre, user_book, offre table utilisateurrelations avec Yii2 table de jonction

a méthode:

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

table user_book a deux champs: user_id, book_id; et les méthodes

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

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

ont méthode comme: getUser(), getBook(),

et maintenant je voudrais exposition livres utilisateur ne pas. J'essaie de faire quelque chose comme

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

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

mais cela ne fonctionne pas. Avez-vous des idées comment puis-je le faire?

Répondre

0

Yii2 docs, relation via junction table

Dans la modélisation de base de données, lorsque la multiplicité entre deux tables connexes est beaucoup à plusieurs, une table de jonction est généralement introduite. Pour l'exemple , la table de commande et la table d'articles peuvent être liées via une table de jonction appelée order_item. Une commande correspondra alors à articles de commande multiples, tandis qu'un article de produit correspondra également à articles de commande multiples.

Lors de la déclaration de telles relations, vous appelez via() ou viaTable() pour spécifier la table de jonction. La différence entre via() et viaTable() est que le premier spécifie la table de jonction en termes d'un nom de relation existant alors que ce dernier utilise directement la table de jonction . Par exemple,

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, j'ai 'getBooks public function() { retour $ this-> hasMany (Livre :: className(), [ 'id' => 'book_id']) -> viaTable ('{{% UserBooks}}', ['user_id' => 'id']); } 'mais comment créer une requête? –

+0

Vous pouvez simplement utiliser 'via ('userBooks')' - vous avez défini cette relation comme je peux le voir. Dans la requête, utilisez '-> joinWith (['books'])', puis dans la requête, utilisez-le comme 'books.id', pas' user.books.id' – Yupik