hasManyToMany 与两个表的关系
hasManyToMany relation with two tables
是否可以用 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']);
}
}
因此组将与子组有 '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();
这有可能吗?
我认为你不能那样做,所以我建议你在你的 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();
有办法做到!
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;
你需要一个中级 Table。我们的应用程序示例:
- @HasManyToMany(
- 'id',
- '\Core\Models\UserCarAssociation',
- 'userId'、'carId'、
- '\Models\Car',
- 'id',
- [别名='car']
- )
这通过中间 table UserCarAssociation 将 Users 连接到 Cars 并通知此 UserCarAssociation Table 中的外键是 userId 和 carId。
有关注释的一些介绍,请参阅此处,我发现它比使用初始化方法注册关系更清晰:https://blog.phalconphp.com/6
是否可以用 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']);
}
}
因此组将与子组有 '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();
这有可能吗?
我认为你不能那样做,所以我建议你在你的 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();
有办法做到!
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;
你需要一个中级 Table。我们的应用程序示例:
- @HasManyToMany(
- 'id',
- '\Core\Models\UserCarAssociation',
- 'userId'、'carId'、
- '\Models\Car',
- 'id',
- [别名='car']
- )
这通过中间 table UserCarAssociation 将 Users 连接到 Cars 并通知此 UserCarAssociation Table 中的外键是 userId 和 carId。
有关注释的一些介绍,请参阅此处,我发现它比使用初始化方法注册关系更清晰:https://blog.phalconphp.com/6