Join Yii-将表连接到一个大表中,并直接访问所有列

Join Yii-将表连接到一个大表中,并直接访问所有列,join,yii,Join,Yii,我在将表连接到一个巨大的表中时遇到了一个问题,这样所有列都可以在没有嵌套FOR或使用关系的情况下访问。情况是这样的: cars ======== id_producer (PK) id_model (PK) length weight ... texts ============ id_model (PK) language (PK) text ... SELECT * FROM cars c JOIN texts t ON c.id_model = t.id_model WHERE t.l

我在将表连接到一个巨大的表中时遇到了一个问题,这样所有列都可以在没有嵌套FOR或使用关系的情况下访问。情况是这样的:

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

texts
============
id_model (PK)
language (PK)
text
...
SELECT *
FROM cars c
JOIN texts t ON c.id_model = t.id_model
WHERE t.language = 'english'
$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();
表共享1个键:id\u模型

我想这样连接这些表:

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

texts
============
id_model (PK)
language (PK)
text
...
SELECT *
FROM cars c
JOIN texts t ON c.id_model = t.id_model
WHERE t.language = 'english'
$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很简单,但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”命令,我做到了,但它并没有像我想的那样工作。

Yii并不难,你只需要阅读文档并应用它们的示例,你想做的事情可以这样做:

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

texts
============
id_model (PK)
language (PK)
text
...
SELECT *
FROM cars c
JOIN texts t ON c.id_model = t.id_model
WHERE t.language = 'english'
$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();
我会告诉您,您已经使用Gii生成了代码,因此关系名称(您可以在Car类中检查)将是文本。现在您有两种方法来完成此操作,简单的方法是:

Cars::model()->with('texts')->findAll("texts.language = 'english'");
这将返回所有车辆及其文本信息,其中文本为英语。我建议您阅读官方指南以了解更多信息

另一种方法是使用CDbCommand执行如下SQL命令:

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

texts
============
id_model (PK)
language (PK)
text
...
SELECT *
FROM cars c
JOIN texts t ON c.id_model = t.id_model
WHERE t.language = 'english'
$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代码行更多。

Hi.我就是这样做的,但返回的结果中仍然有嵌套数组。要获取文本,我需要遍历结果(没问题),但在每条记录中都有另一个包含文本的数组。因此我必须写下这样的内容:“$car->text[0]->text”获取文本。是否因为关系类型“HAS_MANY”?PS:我只想写“$car->text”=使用JOIN将“text”列作为列添加(并可访问)到cars表中。PS2:即使我使用CdbCriteria并指定sections JOIN和CONDITION,我也永远不会得到所需的结果形式=一行上的所有内容。(即使没有使用关系!)最后,我还是使用了一个纯SQL查询,正如您所提到的:“$connection=Yii::app()->db;$command=$connection->createCommand($SQL);$results=$command->queryAll();”我很高兴它成功了:)尝试学习Yii关系。这对你的生活会有很大帮助。