考虑以下示例:
+----------+--------+-------------+----------+
| Person_id| Person | Language_id | Language |
+----------+--------+-------------+----------+
| 1 | Bob | 5 | English |
| 1 | Bob | 3 | Italiano |
| 1 | Bob | 8 | Deutsch |
+----------+--------+-------------+----------+
查询是(不是那么重要,只是编写脚本来向您展示表结构):
SELECT pl.Person_id, Person, Language_id, Language FROM people as p
LEFT JOIN people_languages as pl ON p.Person_id = pl.Person_id
LEFT JOIN languages as l ON pl.language_id = l.language_id
WHERE pl.Person = 1;
所以基本上,如果表是以这种方式构建的,是检索如上所示的所有结果然后创建一个 php 函数来创建一个 person Model with languages_id 和 languages 在一个数组中,还是使用 group_concat 更好?
来检索一行,然后将语言和 languages_id 分解成一个数组?
顺便说一句,无论我做什么,最后我都希望有一个如下的人物模型:
class Person {
public $person_id; // 1
public $person; // Bob
public $language_id; // Array(5, 3, 8)
public $language; // Array(English, Italiano, Deutsch);
.
. // Functions
.
}
最佳答案
我认为你应该将查询分离到它们单独的模型中
应该有一个Language
模型并且会保持简单
class Language
{
function getId() { return $id; }
function getDescription { return $description; }
}
class Person {
public $person_id; // 1
public $person; // Bob
public $languages; //this will store array of Language object
}
//来自数据访问
function getPerson($person_id)
{
$person = new Person();
//select only from Person table
//fill $person properties from records
//$person.person_id = $row['person_id']; etc
//select from people_languages joined to language where person_id=$person_id
$person->languages = getLanguagesByPerson($person->person_id); //returns array of languages
return $person;
}
你现在可以拥有
$person = getPerson(123);
$person->langauges[0]->getId(); //language id
$person->langauges[0]->getDescription(); //language id
$person->langauges[1]->getId(); //language id
$person->langauges[1]->getDescription(); //language id
或者遍历语言
foreach($person->languages as $lang)
{
//use($lang->getId());
//use($lang->getDescription();
}
关于php - Mysql 加入 1 行与多行 - 组 concat 或 php?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12120882/