我将表连接到一个巨大的表中时遇到问题,因此可以访问所有列而不使用嵌套的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不是:(
我尝试使用usinq范围或关系,但从未获得所需的输出。 我想写下以下内容:
$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
}
我知道我可以使用“带”和“在一起”的命令,我做了,但它没有按照我的意愿工作。
答案 0 :(得分:3)
Yii并不难,您只需要阅读文档并应用他们的示例,您想要做的就是这样:
我假设您已使用Gii生成代码,因此关系名称(您可以在Car类中检查)将是文本。现在你有两种方法可以做到:简单的方法:
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行。