2017-02-16 17 views
0

У меня есть свободные столы: пользователь, книга, user_book предлагаетYii2 отношения с соединительной таблицей

пользовательской таблица имеет метод:

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

user_book таблица имеет два поля: user_id, book_id; и методы

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

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

стола предложения есть метод, как: GetUser(), getBook(),

и теперь я хотел бы показать книги, которые пользователь не имеет. Я пытаюсь сделать что-то вроде

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

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

но это не работает. У вас есть идеи, как я могу это сделать?

ответ

0

Yii2 docs, relation via junction table

При моделировании базы данных, когда кратность между двумя связанными таблиц многие-ко-многим, таблица перехода обычно вводится. Например, для таблицы таблица заказов и таблица позиций могут быть связаны через таблицу соединений с именем order_item. Один заказ будет соответствовать товарам нескольких позиций, в то время как один товар также соответствует товарам с несколькими заказами.

При объявлении таких отношений вы можете вызвать через() или viaTable(), чтобы указать таблицу соединений. Разница между via() и viaTable() заключается в том, что первая специфицирует таблицу переходов в условиях существующего имени отношения, а последняя непосредственно использует таблицу соединений . Например,

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

нормально, у меня есть 'общественная функция getBooks() { возвращение $ this-> hasMany (Book :: имя класса(), [ 'ID' => 'book_id']) -> viaTable ('{{% UserBooks}}', ['user_id' => 'id']); } 'но как построить запрос? –

+0

Вы можете просто использовать 'via ('userBooks')' - u определили это отношение, как я вижу. В запросе используйте '-> joinWith (['books'])', а затем в запросе используйте его как 'books.id', а не' user.books.id' – Yupik