2015-10-15 80 views
1

是否可以与2个表进行多对多的关系? 可以说我有以下结构:hasManyTo与两个表的关系

<?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']); 
    } 
} 

因此集团将拥有“的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(); 

,并有可能呢?

+1

距离看一眼,你可能有兴趣在嵌套集你们所做的工作。不是100%,它适合你的使用,但只是从你的代码,它看起来更合适https://github.com/phalcon/incubator/tree/master/Library/Phalcon/Mvc/Model/Behavior#selecting-from-a - 树 –

+0

@ david.duncan,看起来不错。我肯定会在未来深入了解 - 谢谢。 –

回答

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 forum

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(
  • '身份证',
  • '\核心\型号\ UserCarAssociation',
  • '用户id', 'carId',
  • “\:从我们的应用程序的示例模型\汽车”,
  • 'ID',
  • [别名= '汽车']

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

在这里看到一些介绍,注释,我觉得更清洁,然后使用初始化方法来注册关系:https://blog.phalconphp.com/6