Tôi có hai mô hình có mối quan hệ nhiều-một:
lớp Bữa ăn mở rộng \Eloquent {
/**
* Số nguyên công khai $id - khóa chính;
* Chuỗi công khai $name;
*/
được bảo vệ $fillable = array('id','name');
bữa ăn chức năng công cộngProperties()
{
return $this->hasMany('MealProperty');
}
}
lớp MealProperty mở rộng \Eloquent {
/**
* Số nguyên công khai $id - khóa chính;
* Số nguyên công khai $meal_id;
*/
được bảo vệ $fillable = array('id','meal_id');
bữa ăn công cộng()
{
return $this->belongsTo('Meal', 'meal_id');
}
}
Nếu tôi yêu cầu bữa ăn đầu tiênProperty thì mọi chuyện sẽ ổn:
$mealProp = Bữa ăn::first()->mealProperties->first();
Nhưng nếu tôi yêu cầu MealProperty với id cụ thể của bữa ăn đầu tiên theo cách này:
$mealProp = Bữa ăn::first()->mealProperties->where('id','=','1')->first();
Tôi gặp lỗi này:
Gọi tới phương thức không xác định Illuminate\Database\Eloquent\Collection::where()
Tôi đã tìm kiếm trên Google suốt hai giờ để tìm hiểu xem mình đang làm gì sai nhưng vẫn không tìm thấy gì.
Nếu tôi không thể sử dụng phương thức Where thì có cách nào để có được một MealProperty cụ thể không?
Cảm ơn sự giúp đỡ của bạn!
Cập nhật Laravel 5:
Kể từ phiên bản v5,Hỗ trợ\Bộ sưu tập
Có một phương pháp trên đối tượng Ở đâu
, vì vậy câu hỏi/câu trả lời này trở nên không liên quan. Phương pháp này hoạt động với lọc
Hoàn toàn giống nhau, tức là. Trả lại bộ sưu tập đã lọc ngay lập tức:
$mealProp = Meal::first()->mealProperties->where('id','=','1'); // bộ sưu tập đã lọc
// như đã nói, đoạn mã này hoàn toàn hợp lệ trong L5:
$mealProp = Bữa ăn::first()->mealProperties->where('id','=','1')->first();
Bạn phải phân biệt hành vi của Laravel:
(thuộc tính động) Bộ sưu tập hoặc mô hình hùng biện
$meal->mealProperties
đối tượng quan hệ
$meal->mealProperties()
Hiện nay:
// bữa ănProperties là Bộ sưu tập Eloquent và bạn gọi Bộ sưu tập đầu tiên ở đây
// nên về cơ bản nó không ảnh hưởng tới truy vấn db
$mealProp = Bữa ăn::first()->mealProperties->first();
// ở đây bạn thử thêm mệnh đề WHERE trong khi truy vấn db đã được gọi
$mealProp = Bữa ăn::first()->mealProperties->where('id','=','1')->first();
// Vì vậy đây là điều bạn muốn làm:
$mealProp = Bữa ăn::first()->mealProperties()->where('id','=','1')->first();
Tôi là một lập trình viên xuất sắc, rất giỏi!