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