我有两张桌子,tbl_student
和tbl_record
。我想加入他们,但我不知道如何在 Yii 中加入。我正在使用 php。我发现教程提到CDbCriteria
和
'join'=>"INNER JOIN...."
我不知道代码应该在什么功能中,代码应该放在什么模型中。tbl_student
有stud_id
主键并且tbl_record
有record_id
主键和stud_id
作为外键。有人可以告诉我一步一步的过程吗?
我有两张桌子,tbl_student
和tbl_record
。我想加入他们,但我不知道如何在 Yii 中加入。我正在使用 php。我发现教程提到CDbCriteria
和
'join'=>"INNER JOIN...."
我不知道代码应该在什么功能中,代码应该放在什么模型中。tbl_student
有stud_id
主键并且tbl_record
有record_id
主键和stud_id
作为外键。有人可以告诉我一步一步的过程吗?
不要使用手动连接。这可以通过 Active Record 更轻松地完成。但是给你整个“一步一步的过程”并没有你想象的那么受益,你应该自己学习基础知识并提出具体的问题。如果这个答案太令人困惑,那么 Alfredo 是对的,您应该在继续之前花更多时间学习框架。
第 1 步:在各个模型中指定表关系。如果您的数据库模式使用外键(它绝对应该),那么gii
模型生成器可以自动确定这些,否则您需要手动声明它们:
/**
* @property Record[] $records
*/
class Student extends CActiveRecord {
// other code...
public function relations() {
return array(
// other relations
array('records', self::HAS_MANY, 'Record', 'stud_id'),
);
}
}
/**
* @property Student $student
*/
class Record extends CActiveRecord {
// other code...
public function relations() {
return array(
// other relations
array('student', self::BELONGS_TO, 'Student', 'stud_id'),
);
}
}
第 2 步:使用 Active Record 和控制器动作中的关系。这在很大程度上取决于您要做什么。
示例:加载一个学生及其所有记录。请注意,我直接在操作中打印数据 - 这是一个坏主意,我在这里使用它只是为了简洁,在实际应用程序中,您将希望使用此数据呈现视图。
public function actionStudentInfo($id) {
$student = Student::model()->with('records')->findByPk($id);
if(!$student) {
throw new CHttpException(404, "Student not found!");
}
echo "<h2>Found the requested student with details:</h2>",
"<pre>", htmlspecialchars(print_r($student->attributes, true)), "</pre>";
if(count($student->records)) {
echo "<h3>Student records:</h3>", "<ul>";
foreach($student->records as $record) {
echo "<li><pre>", htmlspecialchars(print_r($record->attributes, true)), "</pre></li>";
}
echo "</ul>";
} else {
echo "<p>Student has no records...</p>";
}
}
这其中的关键部分是->with('records')
调用。它告诉 Active Record 系统records
在查询中包含 Student 模型的关系数据。Active Record 将读取该关系并将其包含在查询和返回的结果中 -Student
将Records
在$student->records
(这将是一个数组)中可用。
你可以在关系规范中包含很多额外的细节,例如,现在它会以没有特定顺序的方式获取这些记录,如果你想强制排序,你可以指定'order' => 'field_name ASC'
.
Yii 文档中更详细地介绍了 Active Record 的使用:Active Record,Relational Active Record。