ホームページ >バックエンド開発 >PHPチュートリアル >Laravel5 生徒成績管理システム-04-Eloquent Association
データテーブルは相互に関連していることがよくあります。たとえば、ブログ投稿に複数のコメントが含まれている場合や、注文が 1 人の注文顧客に対応している場合があります。 Eloquent では、これらの関係の管理と処理が簡単になり、複数のタイプの関係もサポートされます。
1 対 1 の関係は、非常に基本的な関係です。たとえば、ユーザー モデルは電話に対応する場合があります。この関連付けを定義するには、Phone メソッドを User モデルに配置する必要があります。 Phone メソッドは、基本クラス Eloquent の hasOne メソッドの結果を返す必要があります:
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{ /** * 获取与指定用户互相关联的电话纪录。 */ public function phone() { return $this->hasOne('App\Phone'); }}
hasOne メソッドに渡される最初のパラメータは、関連付けられたモデルのクラス名です。アソシエーションを定義した後、Eloquent の動的プロパティを使用してアソシエーション レコードを取得できます。動的プロパティを使用すると、モデルで定義されたプロパティであるかのように関連付け関数にアクセスできます:
$phone = User::find(1)->phone;
Eloquent は、対応する関連付けの外部キー名がモデル名に基づいていると想定します。この例では、電話モデルに user_id 外部キーがあると自動的に想定されます。この規則をオーバーライドする場合は、2 番目のパラメーターを hasOne メソッドに渡すことができます。
うわーさらに、Eloquent のデフォルトの外部キーは、上位モデルの id フィールドに対応する値を持ちます。言い換えれば、Eloquent は、ユーザーの id フィールドが電話モデルの user_id フィールドと同じ値を持つレコードを検索します。関連付けで ID 以外の値を使用する場合は、3 番目のパラメーターを hasOne メソッドに渡してカスタム キーを指定できます:
return $this->hasOne('App\Phone', 'foreign_key');
公式ドキュメントを参照する
プロジェクトの実践:
Create Student成績テーブルの成績を取得し、ユーザー テーブル ID に関連付けられた外部キー user_id を確立します。
1 人のユーザーは 1 つの成績テーブルにのみ対応できるため、これは 1 対 1 のモデルであり、その後成績の関連付けを追加します。ユーザー モデル内で
return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
ログイン ユーザーに従って、ログイン ユーザーのスコアを取得します (共同クエリ):
<?phpnamespace App;use Illuminate\Auth\Authenticatable;use Illuminate\Database\Eloquent\Model;use Illuminate\Auth\Passwords\CanResetPassword;use Illuminate\Foundation\Auth\Access\Authorizable;use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;class UsersInfo extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract{ use Authenticatable, Authorizable, CanResetPassword; /** * The database table used by the model. * * @var string */ protected $table = 'users_info'; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = ['name', 'email', 'is_admin', 'password','sex','phone','pro_class']; /** * The attributes excluded from the model's JSON form. * * @var array */ protected $hidden = ['password', 'remember_token']; /** * 登录验证规则 * @return [type] [description] */ protected static function rules() { return [ 'id' => 'required|digits:10', 'password' => 'required' ]; } /** * 建立一对一关系 */ public function grade() { return $this->hasOne('App\Grade'); }}
ただし、ここでエラーが報告されます:
なぜエラーが報告されるのでしょうか?
公式ドキュメントを分析してクエリした後、Eloquent は、対応する関連付けの外部キー名がモデル名に基づいていると想定します。この例では、Grade モデルに users_info_id 外部キーがあると自動的に想定されます。この規則をオーバーライドする場合は、2 番目のパラメーターを hasOne メソッドに渡すことができます。
/** * 返回学生主页 */public function home(){ $grade = Auth::user()->grade; return view('stu.home', compact('grade'));}
スコアを表示:
さらに、Eloquent のデフォルトの外部キーは、上位モデルの id フィールドに対応する値を持ちます。言い換えれば、Eloquent は、ユーザーの id フィールドが Grade モデルの user_id フィールドと同じ値を持つレコードを検索します。関連付けで id 以外の値を使用する場合は、カスタム キーを指定するために hasOne メソッドに 3 番目のパラメーターを渡します。