SQL Joins/Doctrine/Symfony2:当我期望有多个时,从 join 中只得到一个结果
SQL Joins/Doctrine/Symfony2: Only getting one result from join when I expect multiple
所以,我得到了一些数据,这些数据旨在显示某种成分(成分table),并且它可以有不同的名称(ingredient_name table)。这是一些模拟数据:
ingredient
id | mock_name
-------------
1 | "The First Ingredient"
2 | "The second Ingredient"
ingredient_name
--------------
id | ingredient_id | name
1 | 2 | "Milk"
2 | 2 | "Mjolk"
3 | 1 | "Steak"
所以我想要发生的是用户插入成分 ID,然后输出成分数据(在本例中为 "ingredient.mock_name" 和成分别名 (ingredient_name.name)。
我已经使用 Symfony/Doctrine 设置了所有实体、存储库等。这就是我现在拥有的:
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'SELECT I, IGN.name
FROM AppBundle:IngredientName IGN
INNER JOIN AppBundle:Ingredient I WITH IGN.ingredientID=I.id
WHERE IGN.ingredientID=:ingID'
)->setParameters(['ingID' => 2]);
$ingredients = $query->getResult();
这给了我这个结果:
{
"0":{
"id":2,
"mock_name":"The second Ingredient",
},
"name":"Mjolk"
}
我希望得到的是这样的:
{
"0":{
"id":2,
"mock_name":"The second Ingredient",
},
"name":"Mjolk",
"name":"Milk" <---- This value also
}
SQL加入从来都不是我的强项,用教条思考并不能使事情变得容易。这里有人能给我指出正确的方向吗?
我想要这样的东西,但只有一个 SQL 语句,如果可能的话:
$query = $em->createQuery(
'SELECT IGN.name
FROM AppBundle:IngredientName IGN
INNER JOIN AppBundle:Ingredient I WITH IGN.ingredientID=I.id
WHERE IGN.ingredientID=:ingID'
)->setParameters(['ingID' => $ingredientIdentifier]);
$ingredientsNames = $query->getResult();
$query = $em->createQuery(
'SELECT I
FROM AppBundle:IngredientName IGN
INNER JOIN AppBundle:Ingredient I WITH IGN.ingredientID=I.id
WHERE IGN.ingredientID=:ingID'
)->setParameters(['ingID' => $ingredientIdentifier]);
$ingredients = $query->getResult();
$ingredients = array_merge($ingredients, ['ingredientNames' => $ingredientsNames]);
returns:
{
"0":{
"id":2,
"mock_name":"The second Ingredient"
},
"ingredientNames":[
{
"name":"Milk"
},
{
"name":"Mjolk"
}
]
}
我对 Symfony/Doctrine 不是很熟悉,但是看你的 json 结果,不可能将同一个键重复两次。
我相信"name": "Milk" 最初被检索到,但后来被 "name" 覆盖: "Mjolk".
所以,我得到了一些数据,这些数据旨在显示某种成分(成分table),并且它可以有不同的名称(ingredient_name table)。这是一些模拟数据:
ingredient
id | mock_name
-------------
1 | "The First Ingredient"
2 | "The second Ingredient"
ingredient_name
--------------
id | ingredient_id | name
1 | 2 | "Milk"
2 | 2 | "Mjolk"
3 | 1 | "Steak"
所以我想要发生的是用户插入成分 ID,然后输出成分数据(在本例中为 "ingredient.mock_name" 和成分别名 (ingredient_name.name)。
我已经使用 Symfony/Doctrine 设置了所有实体、存储库等。这就是我现在拥有的:
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'SELECT I, IGN.name
FROM AppBundle:IngredientName IGN
INNER JOIN AppBundle:Ingredient I WITH IGN.ingredientID=I.id
WHERE IGN.ingredientID=:ingID'
)->setParameters(['ingID' => 2]);
$ingredients = $query->getResult();
这给了我这个结果:
{
"0":{
"id":2,
"mock_name":"The second Ingredient",
},
"name":"Mjolk"
}
我希望得到的是这样的:
{
"0":{
"id":2,
"mock_name":"The second Ingredient",
},
"name":"Mjolk",
"name":"Milk" <---- This value also
}
SQL加入从来都不是我的强项,用教条思考并不能使事情变得容易。这里有人能给我指出正确的方向吗?
我想要这样的东西,但只有一个 SQL 语句,如果可能的话:
$query = $em->createQuery(
'SELECT IGN.name
FROM AppBundle:IngredientName IGN
INNER JOIN AppBundle:Ingredient I WITH IGN.ingredientID=I.id
WHERE IGN.ingredientID=:ingID'
)->setParameters(['ingID' => $ingredientIdentifier]);
$ingredientsNames = $query->getResult();
$query = $em->createQuery(
'SELECT I
FROM AppBundle:IngredientName IGN
INNER JOIN AppBundle:Ingredient I WITH IGN.ingredientID=I.id
WHERE IGN.ingredientID=:ingID'
)->setParameters(['ingID' => $ingredientIdentifier]);
$ingredients = $query->getResult();
$ingredients = array_merge($ingredients, ['ingredientNames' => $ingredientsNames]);
returns:
{
"0":{
"id":2,
"mock_name":"The second Ingredient"
},
"ingredientNames":[
{
"name":"Milk"
},
{
"name":"Mjolk"
}
]
}
我对 Symfony/Doctrine 不是很熟悉,但是看你的 json 结果,不可能将同一个键重复两次。
我相信"name": "Milk" 最初被检索到,但后来被 "name" 覆盖: "Mjolk".