使用phalcon映射的两个表的json fromat中的响应数据
我正在尝试以json格式获取两个表user和project的数据响应,它们在hasManyusers和belongstoproject中是相关的。我希望根据映射的数据在同一个对象中获得json响应。如果不使用查询生成器或phql代码,我如何做到这一点 这是一个PhalconPhp微应用程序,用作在Apache或localhost上运行的api使用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
//..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,它帮助解决了这个问题