Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/Phalcon-自动嵌套对象_Php_Phalcon - Fatal编程技术网

PHP/Phalcon-自动嵌套对象

PHP/Phalcon-自动嵌套对象,php,phalcon,Php,Phalcon,假设我有三张桌子: CREATE TABLE divisions { idDivision INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR (40) NOT NULL } CREATE TABLE clubs { idClub INT NOT NULL AUTO_INCREMENT PRIMARY KEY, idDivision INT NOT NULL, name VARCHAR(40) NOT NULL }

假设我有三张桌子:

CREATE TABLE divisions {
  idDivision INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR (40) NOT NULL
}

CREATE TABLE clubs {
  idClub INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  idDivision INT NOT NULL,
  name VARCHAR(40) NOT NULL
}

CREATE TABLE footballers (
  idFootballer INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  idClub INT NOT NULL,
  name VARCHAR (40) NOT NULL
)
我有一些可爱的Phalcon模型来代表这些

现在,我想做的是:

$divisions = new Divisions();
print json_encode($divisions::findFirst(), JSON_NUMERIC_CHECK);
返回一个JSON对象,如下所示:

{
idDivision: 1,
name: "Welsh Premier League",
clubs: [
 {
   idClub: 1,
   idDivision: 1,
   name: "Airbus UK",
   players: [
    {
      idPlayer: 1,
      idClub: 1,
      name: "Alf Jones"
    },
    ...
   ]
 },
 ..
]
}

对于Phalcon模型,有没有一种简单的方法可以做到这一点

要自动获取嵌套模型,请使用此递归函数

    $getRelations = function($model, $namespace, $alias = null, $instances = null) use (&$getRelations)
    {
        $modelsManager = $model->getModelsManager();
        $relations = $modelsManager->getRelations($namespace);

        if (is_null($instances)) {
            $response = $model->toArray();
        }

        if (count($relations)) {
            // loop relations
            foreach ($relations as $i => $relation) {
                $options = $relation->getOptions();
                // get alias
                if (isset($options['alias'])) {
                    $subAlias  = $options['alias'];
                    $modelName = $relation->getReferencedModel();
                    $subModel  = new $modelName();
                    // get from model
                    if (is_null($alias) && count($model->{$subAlias})) {
                        $response[$subAlias] = $getRelations(
                            $subModel, $modelName, $subAlias, $model->{$subAlias}
                        );
                    // get from object instance
                    } elseif (count($instances)) {
                        foreach ($instances as $k => $instance) {
                            $response[$k] = $instance->toArray();
                            $response[$k][$subAlias] = $getRelations(
                                $subModel, $modelName, $subAlias, $instance->{$subAlias}
                            );
                        }
                    }
                }
            }
        } else {
            $response = $instances->toArray();
        }

        return $response;           
    };
你可以这样称呼它:

$model = new Division::findFirst($divisionId);
$namespace = 'AppName\Models\Division';
$data = $getRelations($model, $namespace);
$this->response->setJsonContent($data);
确保为每个嵌套模型定义一个别名,如下所示:

class Division extends \Phalcon\Mvc\Model
{
    public function initialize()
    {
        $this->hasMany('id', 'AppName\Models\Club', 'division_id', array(
           'alias' => 'clubs'
        ));
    }
}
更新

改为使用下面的代码(将其放在基本模型中)。这段新代码将允许您获取新(空)模型上的关系

从控制器调用也更容易

$model = new Division::findFirst($divisionId);
$data = $model->toArray(null, 1);
$this->response->setJsonContent($data);

在Phalcon中,可以在模型本身内部定义模型之间的关系。 例如:

最后:

$results = FirstModel::find();

我还没有测试过它(所以没有被接受),但是谢谢-我认为这将非常非常有用嗯,我们有这种代码,但速度很慢。它为每个对象生成多个查询。因此,如果我想要一个具有嵌套关系的对象列表,它会变得非常缓慢(300个对象的速度超过1s)@maddanio是的,我记得我很久以前就向Phalcon团队提到过这一点。显然,关系引用只在按对象的基础上工作。
class FirstModel extends \Phalcon\Mvc\Model
{
    public function initialization()
    {
        $this->hasMany('field', SecondModel::class, 'referenceField', [options]);
    }
}

class SecondModel extends \Phalcon\Mvc\Model
{
    public function initialization()
    {
        $this->hasMany('field', ThirdModel::class, 'referenceField', [options]);
    }
}

class ThirdModel extends \Phalcon\Mvc\Model
{
    // ... some code
}
$results = FirstModel::find();