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

Php viaTable()和via()之间有什么区别?,php,yii2,Php,Yii2,我无法理解viaTable()和via()之间的区别。试图在internet上搜索信息,但找不到任何有用的信息。有人能给我解释一下吗?什么时候应该使用哪一种?如Yii2指南中所述 声明此类关系时,可以调用via()或 viaTable()指定连接表 via()与via()的区别 viaTable()是指前者指定了中的连接表 现有关系名称的术语,而后者直接使用 连接表。比如说, 如Yii2指南中所述 声明此类关系时,可以调用via()或 viaTable()指定连接表 via()与via()的区别

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

如Yii2指南中所述

声明此类关系时,可以调用via()或 viaTable()指定连接表

via()与via()的区别 viaTable()是指前者指定了中的连接表 现有关系名称的术语,而后者直接使用 连接表。比如说,

如Yii2指南中所述

声明此类关系时,可以调用via()或 viaTable()指定连接表

via()与via()的区别 viaTable()是指前者指定了中的连接表 现有关系名称的术语,而后者直接使用 连接表。比如说,

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

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

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


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

当您定义
多对多
关系时,您可以同时使用这两种关系,不同之处在于,当您使用
via()
时,需要在此之前定义一个关系(通常在连接表的模型中),并使用该关系与
via()
将其定义为指向连接表模型的
多对多
关系。但是,当您使用
viaTable()
时,您只能使用连接表的名称和两个主表模型之间的关系来定义
多对多
关系(无需在连接表的模型中定义关系)

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

声明此类关系时,可以调用via()或 viaTable()指定连接表。via()与via()的区别 viaTable()是指前者指定了中的连接表 现有关系名称的术语,而后者直接使用 连接表

以下是两个使用Yii2文档中的两种方法定义
Many_-To-Many
关系的示例(在线市场的
Many_-To-Many
关系,一个订单可以有多个商品[在这个市场上出售的商品],一个商品也可以针对不同的人或同一个人的多个订单):

使用
via()定义关系

使用viaTable()定义关系

附言:我个人认为使用
viaTable()
更符合逻辑,也更方便


注:在Yii2的文档中,您可以找到关于
多对多
关系的完整且解释良好的文档。

当您定义
多对多
关系时,您可以同时使用这两种关系,区别在于当您使用
via()
时,您需要在这之前定义一关系(通常在连接表的模型中)并使用该关系与
via()
将其定义为指向连接表模型的
Many\u to\u Many
关系。但是当使用
viaTable()时
,您只能使用连接表的名称定义多对多关系,并且只能在两个主表模型之间定义关系(无需在连接表的模型中定义关系)

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

声明此类关系时,可以调用via()或 viaTable()指定连接表。via()之间的差异 viaTable()是指前者指定了中的连接表 现有关系名称的术语,而后者直接使用 连接表

以下是两个使用Yii2文档中的两种方法定义
Many_-To-Many
关系的示例(在线市场的
Many_-To-Many
关系,一个订单可以有多个商品[在这个市场上出售的商品],一个商品也可以针对不同的人或同一个人的多个订单):

使用
via()定义关系

使用viaTable()定义关系

附言:我个人认为使用
viaTable()
更符合逻辑,也更方便

附言:你可以从Yii2的文档中找到完整且解释良好的关于多对多关系的文档

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