viaTable()和via()之间有什么区别?

时间:2017-06-20 06:06:26

标签: php yii2

我无法理解viaTable()via()之间的区别。试图在互联网上搜索信息,但找不到任何有用的信息。有人可以解释一下吗?什么时候应该使用?

3 个答案:

答案 0 :(得分:3)

via()使用现有的关系名称,因此您必须先创建建立关系的方法。

viaTable()允许连接另一个表"即时"因此,您不必使用现有的关系名称(因此您不必创建建立关系的方法),但您需要使用此方法的参数进行配置。

答案 1 :(得分:1)

当您定义Many_To_Many关系时,您可以使用两者,不同之处在于您使用via()时,需要在此之前定义关系(通常在联结表的模型中)并使用与via()的关系将其定义为Many_To_Many关系,该关系指向联结表的模型。但是当您使用viaTable()时,您只能使用联结表的名称来定义Many_To_Many关系,并且只能在您的两个主表模型之间定义{无需在联结表中定义关系&#39} ; s模型)。

以下是Yii2指南的简要说明:

  

当声明这种关系时,你可以通过()或者调用   viaTable()指定联结表。 via()之间的区别   和viaTable()是前者指定的联结表   现有关系名称的术语,而后者直接使用   交汇处。

以下是使用Yii2文档中的两种方法定义Many_To_Many关系的两个示例(其为在线市场的Many_To_Many关系,订单可以包含多个项目[在此市场中销售的商品] ]以及一个项目可以是针对不同人或同一个人的多个订单):

使用via()定义关系:

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

使用viaTable()定义关系:

class Order extends ActiveRecord
{
    public function getItems()
    {
        return $this->hasMany(Item::className(), ['id' => 'item_id'])
            ->viaTable('order_item', ['order_id' => 'id']);
    }
}

P.S:我个人认为使用viaTable()更合乎逻辑,更方便。

P.S:您可以在其文档的This Section中找到关于Yii2中Many_To_Many关系的完整且解释良好的文档。

答案 2 :(得分:0)

与Yii2指南一样......

  

当声明这种关系时,你可以通过()或者调用   viaTable()指定联结表。

     

via()之间的区别   和viaTable()是前者指定的联结表   现有关系名称的术语,而后者直接使用   连接表。例如,

http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#junction-table