1

テーブルを 1 つの巨大なテーブルに結合して、ネストされた FOR やリレーションを使用せずにすべての列にアクセスできるようにすることに問題があります。状況は次のとおりです。

cars
========
id_producer (PK)
id_model (PK)
length
weight
...

texts
============
id_model (PK)
language (PK)
text
...

テーブルは 1 つのキーを共有します: id_model

これらのテーブルを次のように結合したい:

SELECT *
FROM cars c
JOIN texts t ON c.id_model = t.id_model
WHERE t.language = 'english'

.. 車ごとに 1 行を返します。

SQL は簡単ですが、Yii はそうではありません :(

スコープまたはリレーションを使用して実行しようとしましたが、目的の出力が得られませんでした。私は次のように書きたい:

$carsWithTexts = Cars::model()-> ... something ... ->findAll()

foreach ($carsWithTexts as $c)
{
    echo $c->id_producer;
    echo $c->id_model;
    echo $c->id_text;
}

.. ネストされた FOR はありません。FOR 内にリレーションまたはスコープはありません。

これは可能ですか?または、常に次の構造を使用する必要がありますか:

$carsWithTexts = Cars::model()-> ... relation ... ->findAll()


foreach ($carsWithTexts as $c)
{
    echo $c->id_producer;
    echo $c->id_model;
    echo $c->relation[0]["id_text"]; // or nested for
}

コマンド「with」および「together」を使用できることはわかっていますが、思い通りに機能しませんでした。

4

1 に答える 1

3

Yii は難しくありません。ドキュメントを読んでその例を適用するだけで済みます。やりたいことは次のように実行できます。

Gii を使用してコードを生成したと仮定すると、リレーション名 (Car クラスで確認できます) は texts になります。これで、簡単な方法でそれを行うための 2 つのアプローチができました。

Cars::model()->with('texts')->findAll("texts.language = 'english'");

これにより、すべての車がテキスト情報とともに返されます。テキストには英語が含まれています。詳細については、公式ガイドのRelational Active Recordをお読みになることをお勧めします。

もう 1 つの方法は、次のように CDbCommand を使用して SQL コマンドを実行することです。

$connection=Yii::app()->db;   // assuming you have configured a "db" connection
$command=$connection->createCommand();
$command->from('cars');
$command->join('texts', 't.id_model = texts.id_model');
$command->where('texts.language=:language', array(':id'=>'english'));
$rows=$command->queryAll();

この方法はより SQL に適していますが、ご覧のとおり、さらに多くの PHP 行があります。

于 2012-05-02T14:28:15.570 に答える