【问题标题】:hasManyToMany relation with two tableshasManyToMany 与两个表的关系
【发布时间】:2015-10-15 12:18:50
【问题描述】:

是否可以与 2 个表建立多对多关系? 假设我有以下结构:

<?php
use Phalcon\Mvc\Model;

/**
entity
-id
-name
-sub_group_id
*/
class Entity extends Model {

    public $id;
    public $name;
    public $sub_group_id;

    public function initialize()
    {
        $this->belongsTo('sub_group_id', 'SubGroup', 'id', ['alias' => 'subgroup']);
    }
}

/**
sub_group
-id
-name
-group_id
*/
class SubGroup extends Model {

    public $id;
    public $name;
    public $group_id;

    public function initialize()
    {
        $this->belongsTo('group_id', 'Group', 'id', ['alias' => 'group']);
        $this->hasMany('id', 'Entity', 'sub_group_id', ['alias' => 'entities']);
    }
}

/**
group
-id
-name
*/
class Group extends Model {

    public $id;
    public $name;

    public function initialize()
    {
        $this->hasMany('id', 'SubGroup', 'group_id', ['alias' => 'subgroups']);
    }
}

所以 Group 将与 SubGroup 具有“hasMany”关系。 子组将与实体具有“hasMany”关系。

要从我使用的组中获取实体:

<?php

$entities = [];
$group = Group::findFirst();
foreach ($group->subgroups as $subgroup){
    $entities = array_merge($entities, $subgroup->entities->toArray());
}

我应该改变什么关系,比如说 子组将与实体具有“hasManyXXX”关系。

得到以下结果:

<?php

$entities = $group->subgroups->entities->toArray();

这有可能吗?

【问题讨论】:

标签: relationship models phalcon


【解决方案1】:

有办法做到这一点!

class Group extends Model 
{
    public $id;
    public $name;

    public function initialize()
    {
        $this->hasManyToMany(
            'id',
            'SubGroup',
            'group_id',
            'id',
            'Entity',
            'sub_group_id',
            [
                'alias' => 'entities'
            ]
        );
    }
}

会给你一个使用选项:

$entities = $group->entities;

感谢phalcon forum

【讨论】:

    【解决方案2】:

    我认为你不能这样做,所以我建议你在 group 模型中添加自定义方法,如下所示:

    class Group extends Model {
    
       public $id;
       public $name;
    
       public function initialize()
       {
           $this->hasMany('id', 'SubGroup', 'group_id', ['alias' => 'subgroups']);
       }
    
       public function getEntities() {
          $entities = [];
          foreach ($this->getSubgroups() as $subgroup){
             $entities = array_merge($entities, $subgroup->entities->toArray());
          }
          return $entities;
       }
    
    }
    

    然后使用此代码获取您的实体:

    $group = Group::findFirst();
    $entities = $group->getEntities();
    

    【讨论】:

      【解决方案3】:

      您需要一个中间表。我们应用程序中的一个示例:

      • @HasManyToMany(
      • 'id',
      • '\Core\Models\UserCarAssociation',
      • 'userId', 'carId',
      • '\Models\Car',
      • 'id',
      • [alias='car']
      • )

      这通过中间表 UserCarAssociation 将用户连接到汽车,并通知此 UserCarAssociation 表中的外键是 userId 和 carId。

      有关注解的一些介绍请参见此处,我发现它比使用初始化方法注册关系更简洁:https://blog.phalconphp.com/6

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多