1

考虑以下示例:

+----------+--------+-------------+----------+
| 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 函数,该函数创建一个具有语言 ID 和语言在数组中的人员模型,或者使用group_concat检索单行然后将语言和languages_id 分解成一个数组?

顺便说一句,无论我做什么,最后我都希望有一个 Person 模型,如下所示:

class Person { 

    public $person_id; // 1
    public $person; // Bob
    public $language_id; // Array(5, 3, 8)
    public $language; // Array(English, Italiano, Deutsch);

    .
    . // Functions 
    .

}
4

3 回答 3

2

这是答案。您可以同时使用这两种方式,但在我看来,使用组连接要好得多。原因是这将提高性能并减少 php 代码。如果你继续你给出的例子,你将不得不在 php 端做很多编码。有时在 php 端处理起来很困难。几个月前我有过这样的经历。相反,使用 group concat 将为您获取单行,其中包含每个人所需的一切。在 php 端简单地提取 Group Concated 单元格并制作另一个循环或将其放入数组中。这很容易处理。

于 2012-08-25T10:05:52.647 回答
2

我认为您应该将查询分成单独的模型

应该有一个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();
}
于 2012-08-25T10:38:47.203 回答
0

考虑使用字典

    class Person { 

        public $person_id; // 1
        public $person; // Bob
        //I don't know php but for your idea
        public Dictionary<int,string> languageList; // KeyValuePairs {(5,English),(3,Italiano),(8,Deutsch)}
        .
        . // Functions 
        .

    }
于 2012-08-25T09:51:26.790 回答