2017-02-16 44 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