2017-02-16 84 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(){ 回報 $這個 - >的hasMany(書::類名(),[ '身份證'=> 'book_id']) - > viaTable('{{%UserBooks}}',['user_id'=>'id']); }'但如何構建查詢? –

+0

你可以使用'via('userBooks')' - 我定義了這個關係,因爲我可以看到。在查詢中使用' - > joinWith(['books'])'然後在查詢中使用它作爲'books.id',而不是'user.books.id' – Yupik