首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel-eloquent:调用未定义的方法Illuminate\Database\Eloquent\Collection::where()

Laravel-eloquent:调用未定义的方法Illuminate\Database\Eloquent\Collection::where()
EN

Stack Overflow用户
提问于 2014-04-09 02:09:12
回答 2查看 31.4K关注 0票数 8

我有两个多对一关系的模型:

代码语言:javascript
复制
class Meal extends \Eloquent {
    /**
     * public Integer   $id; - primary key
     * public String    $name;
     */
    protected $fillable = array('id','name');

    public function mealProperties()
    {
        return $this->hasMany('MealProperty');
    }
}

class MealProperty extends \Eloquent {
    /**
     * public Integer   $id; - primary key
     * public Integer   $meal_id;
     */
    protected $fillable = array('id','meal_id');

    public function meal()
    {
        return $this->belongsTo('Meal', 'meal_id');
    }
}

如果我先要第一顿饭,mealProperty,一切都很好:

代码语言:javascript
复制
$mealProp = Meal::first()->mealProperties->first();

但是如果我以这种方式请求带有第一顿饭的特定id的mealProperty:

代码语言:javascript
复制
$mealProp = Meal::first()->mealProperties->where('id','=','1')->first();

我得到了这个错误:

代码语言:javascript
复制
Call to undefined method Illuminate\Database\Eloquent\Collection::where()

我在谷歌上搜索了两个小时我做错了什么,但仍然一无所获。

如果我不能使用where方法,有什么可能的方法来获取特定的mealProperty?

感谢您的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-09 02:25:19

Laravel 5的更新:

自v5发布以来,Support\Collection对象上有一个方法where,因此这个问题/答案变得无关紧要。该方法的工作原理与filter完全相同,即。直接返回过滤后的集合:

代码语言:javascript
复制
$mealProp = Meal::first()->mealProperties->where('id','=','1'); // filtered collection

// that said, this piece of code is perfectly valid in L5:
$mealProp = Meal::first()->mealProperties->where('id','=','1')->first();

您必须区分Laravel行为:

(动态属性)雄辩的集合或模型

代码语言:javascript
复制
$meal->mealProperties

关系对象

代码语言:javascript
复制
$meal->mealProperties()

现在:

代码语言:javascript
复制
// mealProperties is Eloquent Collection and you call first on the Collection here
// so basically it does not affect db query
$mealProp = Meal::first()->mealProperties->first();

// here you try to add WHERE clause while the db query is already called
$mealProp = Meal::first()->mealProperties->where('id','=','1')->first();

// So this is what you want to do:
$mealProp = Meal::first()->mealProperties()->where('id','=','1')->first();
票数 13
EN

Stack Overflow用户

发布于 2014-04-09 02:54:55

你可以试试这个:

代码语言:javascript
复制
$mealProop1 = Meal::first()->mealProperties->find(1); // id = 1

或者类似这样的东西:

代码语言:javascript
复制
$mealProops = Meal::first()->mealProperties;
$mealProop5 = $mealProops->find(5); // id = 5
$mealProop7 = $mealProops->find(7); // id = 7

而不是这样:

代码语言:javascript
复制
$mealProp = Meal::first()->mealProperties->where('id','=','1')->first();

另外,下面的代码应该可以工作:

代码语言:javascript
复制
$mealProp = Meal::first()->mealProperties->first();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22944937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档