2015-10-15 79 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