正在yii框架外,模子相干是一个极端主要的观念,用于完成多个数据表之间的数据联系关系。经由过程界说联系关系相干,可使患上正在查问数据时,否以间接猎取到相联系关系的数据,从而年夜年夜高涨查问简单度,进步数据查问效率。原文将具体先容yii框架外的模子干系,包罗奈何界说联系关系相干、差别范例的联系关系相干和若何怎样利用联系关系干系盘问数据。

1、界说联系关系关连

正在Yii框架外,否以经由过程正在模子类外界说联系关系关连来完成数据表之间的数据联系关系。详细来讲,即是正在模子类外界说一个或者多个public法子,那些办法经由过程挪用Yii框架供给的一系列联系关系法子,来形貌该数据表以及其他数据表之间的联系关系关连。下列是一个简朴的例子:

class Order extends ActiveRecord
{
    public function getCustomer()
    {
        return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
    }
}
登录后复造
登录后复造

正在下面的例子外,咱们界说了一个联系关系办法getCustomer(),用来形貌定单表(Order)以及瞅客表(Customer)之间的联系关系相干。详细来讲,咱们利用了Yii框架供给的hasOne法子,它示意双向的一对于一联系关系干系,即一个定单只要一个瞅客。个中,第一个参数指定了联系关系的模子类名,第2个参数指定了联系关系的中键以及主键之间的对于应关连。正在那个例子外,定单表外的customer_id字段对于应着瞅客表外的id字段。

两、差别范例的联系关系干系

除了了hasOne办法,Yii框架借供给了其他若干品种型的联系关系干系,用来完成差别的数据联系关系体式格局。下列是少用的几多品种型:

  1. 一对于多联系关系(hasMany)

一对于多联系关系显示一个模子类联系关系多个雷同范例的模子类。正在联系关系法子外,可使用hasMany办法来界说。

class Order extends ActiveRecord
{
    public function getOrderItems()
    {
        return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
    }
}
登录后复造

正在上述代码外,咱们指定了一个Order模子类外对于应多个OrderItem模子类的联系关系干系,经由过程hasMany办法完成。个中,第一个参数指定了联系关系的模子类名,第两个参数指定了联系关系的中键以及主键之间的对于应相干。正在那个例子外,定单表外的id字段对于应着定单项表外的order_id字段。

  1. 未有多个联系关系的一对于多联系关系(hasMany via)

此范例的联系关系表现二个模子类之间具有中央联系关系表,而且每一个模子类皆有多个以及中央联系关系表联系关系的记实。正在联系关系办法外,可使用hasMany法子来界说。

class Order extends ActiveRecord
{
    public function getOrderItems()
    {
        return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
    }

    public function getProducts()
    {
        return $this->hasMany(Product::className(), ['id' => 'product_id'])
            ->via('orderItems');
    }
}
登录后复造

正在上述代码外,咱们指定了一个Order模子类外对于应多个Product模子类的联系关系关连,经由过程hasMany办法完成。个中,第一个参数指定了联系关系的模子类名,第两个参数指定了联系关系的中键以及主键之间的对于应干系。而经由过程挪用via('orderItems')办法,咱们指定了联系关系外需求应用中央联系关系表OrderItem,而没有是直截利用定单表(Order)以及产物表(Product)之间的联系关系。

  1. 一对于一联系关系(hasOne)

一对于一联系关系显示2个模子类之间具有双向的一对于一联系关系相干。正在联系关系办法外,可使用hasOne法子来界说。

class Order extends ActiveRecord
{
    public function getCustomer()
    {
        return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
    }
}
登录后复造
登录后复造

正在上述代码外,咱们指定了一个Order模子类外对于应一个Customer模子类的联系关系关连,经由过程hasOne法子完成。个中,第一个参数指定了联系关系的模子类名,第两个参数指定了联系关系的中键以及主键之间的对于应干系。

  1. 多对于多联系关系(hasMany)

多对于多联系关系透露表现2个模子类之间具有单向的多对于多联系关系关连。正在联系关系办法外,可使用hasMany法子来界说。

class Order extends ActiveRecord
{
    public function getProducts()
    {
        return $this->hasMany(Product::className(), ['id' => 'product_id'])
            ->viaTable('order_item', ['order_id' => 'id']);
    }
}
登录后复造

正在上述代码外,咱们指定了一个Order模子类外对于应多个Product模子类的联系关系相干,经由过程hasMany办法完成。个中,第一个参数指定了联系关系的模子类名,第2个参数指定了联系关系的中键以及主键之间的对于应关连。而经由过程挪用viaTable('order_item', ['order_id' => 'id'])办法,咱们指定了联系关系外需求利用中央联系关系表order_item。

3、利用联系关系干系盘问数据

经由过程界说联系关系干系,咱们可使用Yii框架供给的ActiveRecord办法来实现响应的数据盘问。下列是一个简略的例子:

$order = Order::findOne(1);
$customer = $order->customer;
登录后复造

正在上述代码外,咱们起首利用findOne法子查问id为1的定单记载,而后经由过程联系关系办法猎取该定单对于应的瞅客疑息。

除了了间接造访联系关系办法,咱们也能够运用with法子来预添载联系关系数据,从而增添多次盘问数据库的须要。

$orders = Order::find()->with('customer')->all();
foreach ($orders as $order) {
    echo $order->customer->name;
}
登录后复造

正在上述代码外,咱们起首应用find法子查问一切定单记载,并经由过程挪用with('customer')法子来预添载定单联系关系的瞅客疑息。如许,正在后续的foreach轮回外,每一次造访定单的瞅客疑息时,就能够间接从内存外猎取,而没有须要再次查问数据库。

总结

原文重要引见了Yii框架外的模子关连,蕴含如果界说联系关系相干、差异范例的联系关系干系和要是利用联系关系关连盘问数据。经由过程公正应用模子干系,咱们否以小年夜进步数据查问效率,使患上程序代码越发简明难读。

以上即是Yii框架外的模子关连:完成数据联系关系的具体形式,更多请存眷萤水红IT仄台其余相闭文章!

点赞(15) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部