使用phalcon映射的两个表的json fromat中的响应数据

使用phalcon映射的两个表的json fromat中的响应数据,json,phalcon,Json,Phalcon,我正在尝试以json格式获取两个表user和project的数据响应,它们在hasManyusers和belongstoproject中是相关的。我希望根据映射的数据在同一个对象中获得json响应。如果不使用查询生成器或phql代码,我如何做到这一点 这是一个PhalconPhp微应用程序,用作在Apache或localhost上运行的api //..Service-start..// <?php namespace App\Services; use A

我正在尝试以json格式获取两个表user和project的数据响应,它们在hasManyusers和belongstoproject中是相关的。我希望根据映射的数据在同一个对象中获得json响应。如果不使用查询生成器或phql代码,我如何做到这一点

这是一个PhalconPhp微应用程序,用作在Apache或localhost上运行的api

    //..Service-start..//
    <?php 
    namespace App\Services;
    use App\Models\User;    
        public function getUserList()
        {
            try 
            {
                $users = User::find (
                    [
                        'conditions' => '',
                        'bind'       => [],
                        'columns'    => "id, first_name, last_name, login",
                    ]
                );
          //How to include the project data in same $users variables without using query builder// 
                if (!$users) 
                {
                    return [];
                }

                return $users->toArray();

            } 
            catch (\PDOException $e) 
            {
                throw new ServiceException($e->getMessage(), $e->getCode(), $e);
            }
        }
    //..Controller-end..//

    //..Project Model-start..//
    <?php
    namespace App\Models;
    class Project extends \Phalcon\Mvc\Model
    {

        /**
         *
         * @var integer
         */
        public $id;

        /**
         *
         * @var integer
         */
        public $user_id;

        /**
         *
         * @var string
         */
        public $p_name;

        /**
         *
         * @var string
         */
        public $p_desc;

        /**
         * Initialize method for model.
         */
        public function initialize()
        {
            $this->setSchema("topic");
            $this->setSource("project");
            $this->belongsTo('user_id', 'App\Models\User', 'id', ['alias' => 'User']);
        }

        /**
         * Returns table name mapped in the model.
         *
         * @return string
         */
        public function getSource()
        {
            return 'project';
        }

        /**
         * Allows to query a set of records that match the specified conditions
         *
         * @param mixed $parameters
         * @return Project[]|Project|\Phalcon\Mvc\Model\ResultSetInterface
         */
        public static function find($parameters = null)
        {
            return parent::find($parameters);
        }

        /**
         * Allows to query the first record that match the specified conditions
         *
         * @param mixed $parameters
         * @return Project|\Phalcon\Mvc\Model\ResultInterface
         */
        public static function findFirst($parameters = null)
        {
            return parent::findFirst($parameters);
        }

    }
    //..Project Model-end..//

    //..User Model-start..//

    <?php
    namespace App\Models;
    //use App\Models\Project;
    class User extends \Phalcon\Mvc\Model
    {

        /**
         *
         * @var integer
         */
        public $id;

        /**
         *
         * @var string
         */
        public $first_name;

        public $last_name;

        /**
         *
         * @var string
         */
        public $pass;

        /**
         *
         * @var integer
         */
        public $login;

        /**
         * Initialize method for model.
         */
        public function initialize()
        {
            $this->setSchema("topic");
            $this->setSource("user");
            $this->hasMany("id", "App\Models\Project", "user_id", array(
                'alias' => 'projects'
              ));
        }

        /**
         * Returns table name mapped in the model.
         *
         * @return string
         */
        public function getSource()
        {
            return 'user';
        }

        /**
         * Allows to query a set of records that match the specified conditions
         *
         * @param mixed $parameters
         * @return User[]|User|\Phalcon\Mvc\Model\ResultSetInterface
         */
        public static function find($parameters = null)
        {
            return parent::find($parameters);
        }

        /**
         * Allows to query the first record that match the specified conditions
         *
         * @param mixed $parameters
         * @return User|\Phalcon\Mvc\Model\ResultInterface
         */
        public static function findFirst($parameters = null)
        {
            return parent::findFirst($parameters);
        }

    }

    //..User Model-end..//

    The expected output should be :
      [  {
            "id": "2",
            "first_name": "Nametest",
            "last_name": "Sourtest",
            "login": "0",
            "projects":    [{
            "id": "1",
            "p_name": "Project1",
            "p_desc": "testing",
            "user_id": "2"
        },
        {
            "id": "2",
            "p_name": "Project2",
            "p_desc": "testing2",
            "user_id": "2"
        }]
        },
        {
            "id": "3",
            "first_name": "Nametest1",
            "last_name": "Sourtest",
            "login": "0",
            "projects":    [{
            "id": "3",
            "p_name": "Project123",
            "p_desc": "testing123",
            "user_id": "3"
        },
        {
            "id": "4",
            "p_name": "Project234",
            "p_desc": "testing234",
            "user_id": "3"
        }]
        }
    ]

    The output I am getting now is just users how to write the code to include projects in the same object:
    [{
            "id": "2",
            "first_name": "Nametest",
            "last_name": "Sourtest",
            "login": "0"
        },
        {
            "id": "3",
            "first_name": "Nametest1",
            "last_name": "Sourtest",
            "login": "0"
        }]

您有以下选项:

操纵数组 获取用户数组,获取项目数组,将它们合并到一个循环中,然后返回数据。这肯定会影响性能,占用更多内存。请注意,这个实现引入了臭名昭著的N+1问题,即在循环中引入了一个查询,对数据库的影响超过了要求

$data=[]; $users=users::find [ '列'=>'id,名字,姓氏,登录' ] ; foreach$users作为$user{ $record=$user->toArray; $projects=projects::find [ '条件'=>'用户id=:用户id:', “绑定”=>[ 'user_id'=>$user->id, ] ] ; //现在将项目添加到记录中 $record['projects]=$projects->toArray; //将记录添加到最终数组中 $data[]=$record; } 使用关系 易于处理,但仍存在N+1问题

$data=[]; $users=users::find [ '列'=>'id,名字,姓氏,登录' ] ; foreach$users作为$user{ $record=$user->toArray; $projects=$user->getRelated'projects'; //现在将项目添加到记录中 $record['projects]=$projects->toArray; //将记录添加到最终数组中 $data[]=$record; } 使用生成器 我意识到你提到你不想使用建设者,但是考虑一下它,因为它为你的需求提供了最好的性能

$results=newbuilder ->addFromUsers::类“u” ->leftJoinProjects::类“p” ->纵队 [ “u_id”=>“u.id”, “名字”=>“名字”, “姓氏”=>“姓氏”, 'login'=>'u.login', “p_id”=>“p.id”, “p_name”=>“p_name”, “p_desc”=>“p_desc”, ] ->订购人'u.姓,u.名,p.p\u名' ->获取查询 ->执行 ; $data=[]; foreach$结果作为$记录{ $data[$results->u_id]=[ 'id'=>$record->id, 'first\u name'=>$record->first\u name, “姓氏”=>$record->last\u name, 'login'=>$record->login, “项目”[$result->p_id]=>[ 'id'=>$result->p_id, 'p_name'=>$result->p_name, 'p_desc'=>$result->p_desc, ], ]; } 返回$data;
注意:上面的代码是用于演示的,我还没有测试过,所以您可能需要根据自己的需要进行调整

谢谢Nikolaos Dimopoulos,它帮助解决了这个问题