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;

基本的に、このようにテーブルが構築されている場合、上記のようにすべての結果を取得してから、配列内の languages_id と languages を使用して Person モデルを作成する php 関数を作成するか、または を使用group_concatして単一の行を取得し、次にlanguages と 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 
    .

}
4

3 に答える 3

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

}

//DataAccess から

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 に答える
2

これが答えです。両方の方法を使用できますが、私の意見では、グループ連結を使用する方がはるかに優れています。その理由は、これによりパフォーマンスが向上し、php コードが削減されるためです。与えられた例を続けると、php 側で多くのコーディングを行う必要があります。また、PHP 側での処理が困難になる場合もあります。私は数ヶ月前にこの経験をしました。代わりに group concat を使用すると、各人に必要なものがすべて含まれる単一の行が取得されます。PHP側で、グループ連結セルを単純に抽出し、別のループを作成するか、配列に入れます。それは扱いやすいです。

于 2012-08-25T10:05:52.647 に答える
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 に答える