我的控制器中有以下标准。
$criteria = new CDbCriteria;
$criteria->select = 't.*,b.*,c.*';
$criteria->join = "INNER JOIN tbl_patient_chair b ON b.patient = '0005'
INNER JOIN tbl_chair c ON b.chair = c.Serial_No";
$criteria->condition = "t.client_id = '0005'";
$model = Patient::model()->findAll($criteria);
$this->render('view', array(
'model' => $model
));
然后在我看来,我试图通过执行以下操作来检索所有选定的数据:
foreach ($model as $models)
print_r($model);
但是在结果中我可以看到第二和第三张表中没有数据。第一个表的数据已成功检索,但我无法显示其他表的数据。
谁能告诉我我做错了什么?
答案 0 :(得分:1)
通过创建关系,最好在Yii中使用联接,这样您就不需要编写复杂的查询
首先在sql表中添加外键 (例如,将一名外国患者加入主席)
接下来,如果您重新生成模型,您可以看到自动添加的关系(或者您可以手动添加关系)
public function relations()
{
return array(
'chairs' => array(self::HAS_MANY, 'chair', 'patientId'),
);
}
在椅子模型中,您将看到关系
'patient' => array(self::BELONGS_TO, 'patient', 'patientId'),
单独定义关系允许您访问查询模型中的值$ model-> relationName,如果要在'where'条件中使用列,请在模型函数中使用以下查询
$patients=Patient::model()->findAll(array(
'condition' => "$field like '%$value%'",
'with'=>array('chairs'),
'select'=> "*",
));
“with”关键字很重要,可以使用一系列关系列表来包含在查询中。查询条件将应用于所有包含的表。如果您不想查询另一个表中的字段并且只需要链接的输出数据,则可以跳过此处的“with”关键字。
您可以通过
联系分配给患者的椅子foreach($patients as $patient)print_r($patient->chairs);
还有其他方法,例如讨论here
要更多地了解关系,请转到here