1

私は2つのテーブルを持っていtbl_studentますtbl_record. 私は彼らに参加したいのですが、Yii でそれを行う方法がわかりません。私はphpを使用しています。言及しているチュートリアルを見つけましCDbCriteria

'join'=>"INNER JOIN...."

コードがどの機能にあるべきか、コードをどのモデルに配置する必要があるかわかりません。主キーをtbl_student持ち、主キーを持ち、外部キーとして持つ。誰かが私に段階的なプロセスを教えてもらえますか?stud_idtbl_recordrecord_idstud_id

4

1 に答える 1

9

手動結合は使用しないでください。これは、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 とリレーションを使用します。これは、何をしようとしているかに大きく依存します。

例: 1 人の生徒にすべてのレコードをロードします。アクションでデータを直接出力していることに注意してください。これは悪い考えであり、簡潔にするためにここで使用しています。実際のアプリケーションでは、代わりにこのデータを使用してビューをレンダリングする必要があります。

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 システムに、Student モデルのrecordsリレーション データをクエリに含めるように指示します。Active Record はそのリレーションを読み取り、それをクエリと返された結果に含めます -StudentRecords利用可能になります$student->records(これは配列になります)。

リレーション仕様に含めることができる追加の詳細が多数あります。たとえば、現在、これらのレコードは特定の順序で取得されません。順序を強制したい場合は、 を指定できます'order' => 'field_name ASC'

アクティブ レコードの使用法については、Yii ドキュメントで詳しく説明されています:アクティブ レコードリレーショナル アクティブ レコード

于 2012-04-28T10:58:34.803 に答える