将静态函数添加到\ Illuminate \ Database \ Eloquent \ Collection

时间:2014-12-04 13:24:57

标签: php laravel laravel-4 eloquent

我试图将静态函数添加到Illuminate\Database\Eloquent\Collection

我尝试了以下内容:

创建了一个类:

class CustomCollection extends \Illuminate\Database\Eloquent\Collection
{
    public static function test()
    {
        die('test');
    }
}

然后我尝试将课程包括在内。

但没有运气,我收到错误消息:Call to undefined method Illuminate\Database\Eloquent\Collection::test()

调用User::where('id', 1)->get()->test();

时会显示错误消息

2 个答案:

答案 0 :(得分:3)

要使用您的集合而不是Eloquent提供的集合,请在模型中添加方法:

public function newCollection(array $models = [])
{
    // of course, adjust your namespace accordingly
    return new CustomCollection($models);
}

它将在Illuminate\Database\Eloquent\Model class:

中覆盖此方法
/**
 * Create a new Eloquent Collection instance.
 *
 * @param  array  $models
 * @return \Illuminate\Database\Eloquent\Collection
 */
public function newCollection(array $models = array())
{
    return new Collection($models);
}

现在,每当Eloquent查询返回集合时(例如,使用YourModel::all()),将使用自定义集合,并且您添加的方法将可用。

来源:Laravel Docs

答案 1 :(得分:1)

由于我不能使用评论功能,我必须回答,虽然我不觉得它应该被标记为答案。您的错误指出您正在调用Collection :: test()。集合类中的方法测试不存在!您使用Collection扩展了CustomCollection,并将一个方法添加到CustomCollection而不是Collection!