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。现在您有两种方法可以做到这一点,最简单的方法:

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

这将返回所有带有文本信息的汽车,其中文本为英语。我建议您阅读官方指南中的Relational Active Record以了解更多信息。

另一种方法是使用 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 回答