将数组传递给Eloquent模型的静态方法

时间:2017-10-20 19:49:55

标签: php laravel eloquent

我使用Laravel,我需要将一个关联数组传递给一个雄辩的模型中的静态函数。

class MyClass extends Eloquent\Model
{
    static function scopeRegister($input) {
        return $input['key1'];
    }
}

使用Tinker运行,这是我的输入:

$input = array('key1'=>'value', 'key2'=>'value', 'key3'=> 'value', 'key4'=>'value');

但是,当我尝试它时,我收到了错误:

  

PHP错误:无法使用Illuminate \ Database \ Eloquent \ Builder类型的对象作为数组

当我输入提示数组:

class MyClass extends Eloquent\Model
{
    static function scopeRegister(array $input) {
        return $input['key1'];
    }
}

我收到以下错误:

  

传递给App \ KeywordGeotarget :: scopeRegister()的参数1必须是类型数组,给定对象

这里发生了什么以及如何从模型中的静态方法访问数组中定义的值?

编辑:我现在只是使用修补程序来测试这个,但这是我用来调用方法的代码:

php artisan tinker
>> $input = array('key1'=>'value','key2'=>'value','key3'=>'value', 'key4'=>'value');
>> App\MyClass::register($input);

3 个答案:

答案 0 :(得分:1)

由于它是作用域,因此您需要添加$query作为第一个参数,然后执行以下操作:

static function scopeRegister($query, array $input)
{
    return $query->where($input['key1']);
}

如果您只想拥有一个方法并且不想将其用作本地范围,只需重命名该方法(删除scope部分):

static function register(array $input)

答案 1 :(得分:1)

您对添加查询范围的理解是错误的我想您需要查看我认为的文档。 Check it over here. 范围表示查询构建器属性,您无法将构建器类属性作为数组获取。你应该这样使用它。

class MyClass extends Eloquent\Model
{
    public function scopeRegister($query) {

        return $query->where(// perform your where here);

    }
}

答案 2 :(得分:1)

您正在定义一个雄辩的范围。范围不适用于数组,但适用于查询。

您可以在此处详细了解如何声明和使用范围https://laravel.com/docs/5.5/eloquent#local-scopes

如果您想像修补程序示例中那样调用register(),请执行此操作(只需删除范围):

class MyClass extends Eloquent\Model
{
    static function register(array $input) {
        return $input['key1'];
    }
}