0

我有空闲表:user、book、user_book、offers

用户表有方法:

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']);

但它不起作用。你有什么想法我该怎么做吗?

4

1 回答 1

1

Yii2 文档,通过联结表的关系

在数据库建模中,当两个相关表之间的多重性是多对多时,通常会引入联结表。例如,订单表和项目表可以通过名为 order_item 的联结表关联。一个订单将对应多个订单项目,而一个产品项目也将对应多个订单项目。

声明此类关系时,您将调用 via() 或 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');
    }
}
于 2017-02-16T14:40:19.100 回答