Php SQL联接将联接数据作为数组返回
我试图在服务器端为前端制作一些好的结构数据 响应应该如下所示:Php SQL联接将联接数据作为数组返回,php,mysql,pdo,Php,Mysql,Pdo,我试图在服务器端为前端制作一些好的结构数据 响应应该如下所示: [ { "id": "57484a7e0cdb86d125ebce9c", "wasCalled": true, "wasGood": false, "candidateName": "Tonia Santos", "positions": [ { "positionId": "48asd4
[
{
"id": "57484a7e0cdb86d125ebce9c",
"wasCalled": true,
"wasGood": false,
"candidateName": "Tonia Santos",
"positions": [
{
"positionId": "48asd4asd36",
"positionName": "Pozicia1"
},
{
"positionId": "954asd5as4d",
"positionName": "Pozicia4"
}
],
"addedBy": "User1",
"registered": "2014-11-30T07:13:27 -01:00"
}
]
class getCandidates
{
public function getFromDatabase(){
try {
$con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "SELECT * FROM candidates as c INNER JOIN candidates_positions as cp ON c.id=cp.candidateId;";
$stmt = $con->prepare($sql);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}catch( PDOException $e ) {
return $e->getMessage();
}
}
public function createJson($data){
return json_encode($data);
}
}
[{
"id": "1",
"firstName": "Tonia",
"lastName": "Santos",
"addedBy": "22",
"wasCalled": "1",
"wasGood": null,
"candidateId": "1",
"positionId": "1",
"positionName": "Pozicia4"
},
{
"id": "1",
"firstName": "Tonia",
"lastName": "Santos",
"addedBy": "22",
"wasCalled": "1",
"wasGood": null,
"candidateId": "1",
"positionId": "1",
"positionName": "Pozicia1"
}]
数据库结构:
[
{
"id": "57484a7e0cdb86d125ebce9c",
"wasCalled": true,
"wasGood": false,
"candidateName": "Tonia Santos",
"positions": [
{
"positionId": "48asd4asd36",
"positionName": "Pozicia1"
},
{
"positionId": "954asd5as4d",
"positionName": "Pozicia4"
}
],
"addedBy": "User1",
"registered": "2014-11-30T07:13:27 -01:00"
}
]
class getCandidates
{
public function getFromDatabase(){
try {
$con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "SELECT * FROM candidates as c INNER JOIN candidates_positions as cp ON c.id=cp.candidateId;";
$stmt = $con->prepare($sql);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}catch( PDOException $e ) {
return $e->getMessage();
}
}
public function createJson($data){
return json_encode($data);
}
}
[{
"id": "1",
"firstName": "Tonia",
"lastName": "Santos",
"addedBy": "22",
"wasCalled": "1",
"wasGood": null,
"candidateId": "1",
"positionId": "1",
"positionName": "Pozicia4"
},
{
"id": "1",
"firstName": "Tonia",
"lastName": "Santos",
"addedBy": "22",
"wasCalled": "1",
"wasGood": null,
"candidateId": "1",
"positionId": "1",
"positionName": "Pozicia1"
}]
- 候选人:所有信息除外的职位 |id | wascall | wasGood |由| firstName | lastName添加
- 候选职位:每行是一个用户和一个职位 |id |候选id |职位id |职位名称
[
{
"id": "57484a7e0cdb86d125ebce9c",
"wasCalled": true,
"wasGood": false,
"candidateName": "Tonia Santos",
"positions": [
{
"positionId": "48asd4asd36",
"positionName": "Pozicia1"
},
{
"positionId": "954asd5as4d",
"positionName": "Pozicia4"
}
],
"addedBy": "User1",
"registered": "2014-11-30T07:13:27 -01:00"
}
]
class getCandidates
{
public function getFromDatabase(){
try {
$con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "SELECT * FROM candidates as c INNER JOIN candidates_positions as cp ON c.id=cp.candidateId;";
$stmt = $con->prepare($sql);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}catch( PDOException $e ) {
return $e->getMessage();
}
}
public function createJson($data){
return json_encode($data);
}
}
[{
"id": "1",
"firstName": "Tonia",
"lastName": "Santos",
"addedBy": "22",
"wasCalled": "1",
"wasGood": null,
"candidateId": "1",
"positionId": "1",
"positionName": "Pozicia4"
},
{
"id": "1",
"firstName": "Tonia",
"lastName": "Santos",
"addedBy": "22",
"wasCalled": "1",
"wasGood": null,
"candidateId": "1",
"positionId": "1",
"positionName": "Pozicia1"
}]
它实际创建的内容:
[
{
"id": "57484a7e0cdb86d125ebce9c",
"wasCalled": true,
"wasGood": false,
"candidateName": "Tonia Santos",
"positions": [
{
"positionId": "48asd4asd36",
"positionName": "Pozicia1"
},
{
"positionId": "954asd5as4d",
"positionName": "Pozicia4"
}
],
"addedBy": "User1",
"registered": "2014-11-30T07:13:27 -01:00"
}
]
class getCandidates
{
public function getFromDatabase(){
try {
$con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "SELECT * FROM candidates as c INNER JOIN candidates_positions as cp ON c.id=cp.candidateId;";
$stmt = $con->prepare($sql);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}catch( PDOException $e ) {
return $e->getMessage();
}
}
public function createJson($data){
return json_encode($data);
}
}
[{
"id": "1",
"firstName": "Tonia",
"lastName": "Santos",
"addedBy": "22",
"wasCalled": "1",
"wasGood": null,
"candidateId": "1",
"positionId": "1",
"positionName": "Pozicia4"
},
{
"id": "1",
"firstName": "Tonia",
"lastName": "Santos",
"addedBy": "22",
"wasCalled": "1",
"wasGood": null,
"candidateId": "1",
"positionId": "1",
"positionName": "Pozicia1"
}]
有没有什么好的方法或最佳实践来创建类似于这个问题的JSON,而不必对数据库进行多次选择并构建JSON
感谢您提供的任何建议您可以通过更改createJson方法来解析结果并获得所需的结果
public function createJson($data){
return_array = array();
foreach($data as $val)
{
$return_array['id']= $val['id'];
$return_array['candidateName']= $val['candidateName'];
$return_array['wasCalled']= $val['wasCalled'];
$return_array['wasGood']= $val['wasGood'];
$return_array['addedBy']= $val['addedBy'];
$return_array['positions'][] = array('positionId'=> $val['positionId'],'positionName'=>$val['positionName']);
}
return json_encode($return_array);
}
您必须更改您的查询 我应该用
选择ID,如果(wascall=1,true,false)作为wascall,如果(wasGood=1,true,false)作为wasGood,
concat(firstName,' ',lastName) as candidateName, positionID, positionName,addedBy
顺便说一句,这只是一个部分的解决方案,你必须将这个方案与Deceptio的答案结合起来,才能得到最终的解决方案。
这是必要的,因为您没有candidateName字段,必须创建。
此外,请注意,addedBy返回一个ID,您希望名称与该ID绑定,因此我推断您还有一些其他表,您必须在其中提取此信息,因为您为相同的人获得多行,包含不同的位置,它可能看起来像(从我的脑海中输入,因此可能会出现一些错误,但请尝试一下并查看):
请注意
注册的
和由
添加的注释尽管您的问题已得到解决,但请务必查看以下答案,它更简洁明了
答复:
使用MySQL的GROUPBY
和GROUP\u CONCAT
子句,然后像这样更改查询
SELECT c.*, GROUP_CONCAT(cp.positionId, '|', cp.positionName) as positions
FROM candidates as c
INNER JOIN candidates_positions as cp
ON c.id=cp.candidateId
GROUP BY c.id
以下是参考资料:
getFromDatabase()
方法
public function getFromDatabase(){
try {
$con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "SELECT c.*, GROUP_CONCAT(cp.positionId, '|', cp.positionName) as positions FROM candidates as c INNER JOIN candidates_positions as cp ON c.id=cp.candidateId GROUP BY c.id";
$stmt = $con->prepare($sql);
$stmt->execute();
$result_arr = array();
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
$tmp_arr = array('id' => $result['id'], 'wasCalled' => $result['wasCalled'], 'wasGood' => $result['wasGood'], 'addedBy' => $result['addedBy'], 'firstName' => $result['firstName'], 'lastName' => $result['lastName']);
$positions = explode(",", $result['positions']);
foreach($positions as $s){
$components = explode("|", $s);
$tmp_arr['positions'][] = array('positionId' => $components[0], 'positionName' => $components[1]);
}
$result_arr[] = $tmp_arr;
}
return $result_arr;
}catch( PDOException $e ) {
return $e->getMessage();
}
}
稍后,您可以将返回的
$result\u arr
数组传递给createJson()
方法,并在其上应用json\u encode
。这不是一个好的数组,因为数据库会返回每个位置的记录hi@theDeceptio感谢您的回答。我认为这不正确,它创建了对象数组,但不是返回2个候选位置,其中1有2个位置,2有1个位置,而是返回类似于ehttp://pastebin.com/WdZcUhYhHi @Oliver,我想你很接近了,但这不会返回对象数组。示例JSON看起来像:@Andurit好吧,就我所见,这是一个对象数组,但我确实搞乱了附加位置,我已经更新了那个位(答案中更新了代码)嘿,伙计,谢谢你的回答。我已经竖起大拇指,会思考这个问题。对我来说,作为一个能把他自己当成初学者的人,这比以前的答案看起来更干净。谢谢你!为什么你会使用<代码> GROPY-CONTAT < /代码>,和一个空间连起来?如果这个位置有空间查拉,代码就会崩溃。或者,如果group\u concat()
正在使用任何东西,无论如何:您无法确定选择作为concat字符串传递的内容不会作为位置名称出现,因此破坏了explode()
应该执行的逻辑。@OliverMaksimovic[1/2]1)您究竟为什么要使用group\u concat。。。?因为它使代码更加简洁和可视化,并且使操作更加容易。何况你为什么不呢?2) 如果位置中有空格字符,代码将崩溃。。。?根据OP的示例json字符串,positionName中没有空格,我在写这个答案时记住了这一点。然而,你可能是对的。假设positionName可能在某个地方有一个空格,我进一步更新了我的答案(不是空格,而是在…@OliverMaksimovic[2/2]…单独的对中添加了一个管道字符)。现在,在任何情况下都可以。