2016-07-01 2 views
1

私はLaravel 5でEloquentを使用していますが、テーブル間の関係で少し混乱しています。これらはソフトウェアの既存の表であり、変更することはできません。Eloquentを使用した関係

学生の歴史的な詳細を示す次の表があります。すべてのテーブルにはモデルクラスが作成されています。以下は

student 
------- 
student_id (PK) 
first_name 
last_name 

class 
----- 
class_id (PK) 
name 
section 
year //2012, 2013 etc 
student_id (FK) 

result 
------ 
result_id (PK) 
class_id (FK) 
month  // jan, feb etc 
status  //pass or fail 

各テーブルの詳細については、その年の特定の年のクラスで

  • 学生の研究
  • 各クラスは、年の各月の10個の結果(1つの結果を持っていますされています)
  • 各結果は、ACCに私が欲しい(合格または不合格)月にテスト用

を状態が含まれています以下の例に基づいてオブジェクトを作成します。あなたはすべての

student->class(2013)->result(jan) 
result(feb)->class(2016)->student 
+0

laravelのドキュメントとlaravelポッドキャストを確認してください。そこには多くの良い情報があります。 https://laravel.com/docs/5.1/eloquent-relationships – apokryfos

答えて

3

まず、あなたがあなたのモデル間の関係を定義する必要がモデルクラス内のリレーションを設定するに導くことができる:

Result.phpモデル

public function class(){ 
    return $this->belongsTo('Class::class'); 
} 

クラス。 PHPモデル

public function results(){ 
    return $this->hasMany('Result::class'); 
} 

public function student(){ 
    return $this->belongsTo('Student::class'); 
} 

Student.phpモデル

public function classes(){ 
    return $this->hasMany('Class::class'); 
} 

その後、あなたはいくつかのクエリを使用することができます。また

$results = Student::find($student_id)->classes()->where('year', '2013')->results()->where('month', 'jan')->get(); 

、あなたは月によって毎年、その結果により多くの時間をクラスを検索する必要がある場合は、あなたが簡単にあなたのモデルでは、このようないくつかのメソッドを追加することができます:あなたの最初の例student->class(2013)->result(jan)ため

Student.phpモデル

public function classesByYear($year){ 
    return $this->classes()->where('year', $year)->get(); 
} 

Class.phpとモデル

public function resultsByMonth($month){ 
    return $this->results()->where('month', $month)->get(); 
} 

ので、前の例では、となります:

$results = Student::find($student_id)->classesByYear('2013')->resultsByMonth('jan'); 

EDIT:あなたのテーブルがカスタム識別子を使用しているので、あなたは、各モデルにprotected $primaryKey = 'custom_id';を実装する必要があります。

関連する問題