与两个表有ManyToMany关系

问题描述 投票:0回答:3

是否可以与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();

这有可能吗?

php model relationship phalcon
3个回答
3
投票

有办法做到这一点!

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 论坛


1
投票

我认为你不能这样做,所以我建议你在

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();

0
投票

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

  • @HasManyToMany(
  • 'id',
  • '\Core\Models\UserCarAssociation',
  • '用户ID','汽车ID',
  • '\模型\汽车',
  • 'id',
  • [别名='汽车']

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

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

© www.soinside.com 2019 - 2024. All rights reserved.