方法 Illuminate\Support\Collection::find 不存在

Posted

技术标签:

【中文标题】方法 Illuminate\\Support\\Collection::find 不存在【英文标题】:Method Illuminate\Support\Collection::find does not exist方法 Illuminate\Support\Collection::find 不存在 【发布时间】:2022-01-22 12:20:27 【问题描述】:

编辑功能:

public function editCheck($id, LanguagesRequest $request)

    try
        $language = language::select()->find($id);
        $language::update($request->except('_token'));
        return redirect()->route('admin.languages')->with(['sucess' => 'edit done by sucsses']);
     catch(Exception $ex) 
        return redirect()->route('admin.addlanguages');
    

和模型或选择功能

public function scopeselect()
   
    return  DB::table('languages')->select('id', 'name', 'abbr', 'direction', 'locale', 'active')->get();

【问题讨论】:

理想情况下,范围应该构建一个不返回结果的查询...为什么要直接在模型内部使用查询生成器?并且常规集合没有 find 方法,只有 Eloquent Collections 有,但是您在那里使用查询生成器,因此它不会返回 Eloquent 集合 还有一个查询生成器的 select 方法已经被阻止,您现在可以在使用此模型构建查询时使用它,所以不是最好的主意....这不是您编写的范围只是一个应该是真正的静态方法的方法 【参考方案1】:

scopeselect() 返回一个Collection,然后您尝试使用->find() 过滤它,这是QueryBuilders 上的一个方法。

您可以按照this answer 中的建议使用->filter()->first() 进行过滤

$language = language::select()->first(function($item) use ($id) 
    return $item->id == $id;
);

话虽如此,您确实应该找到一种完全不同的方法来完成所有这些工作。您应该首先使用 $id 和 Eloquent 来获取您想要的对象。

【讨论】:

附加说明:Illuminate\Database\Eloquent\Collection 对象上有一个 find() 方法。但是,OP 的作用域没有使用 Eloquent,所以它返回一个普通的 Illuminate\Support\Collection 对象,它没有 find() 方法。【参考方案2】:

此代码效率非常低,您要选择表中的每条记录,然后对其进行过滤以找到您的 ID。这会很慢,而且完全没有必要。你也没有使用任何 Laravel 专门为简化这种事情而设计的功能。

假设你有一个名为Language的模型,如果你使用route model binding,事情就简单多了:

    确保您的路线使用单词language 作为占位符,例如,您使用此方法的路线可能如下所示:

    Route::post('/languages/check/language', 'LanguagesController@editCheck');
    

    在方法中输入提示语言作为参数:

    public function editCheck(Language $language, LanguagesRequest $request) 
    

    完成 - $language 现在是您所追求的单一模型,您可以使用它而无需任何选择、过滤、查找 - Laravel 已经为您完成了这一切。

    public function editCheck(Language $language, LanguagesRequest $request) 
        // $language is now your model, ready to work with
        $language::update($request->except('_token'));
        // ... etc
    

如果您不能使用路由模型绑定,或者不想使用,您仍然可以使这更加简单和高效。再次假设你有一个Language 模型:

public function editCheck($id, LanguagesRequest $request) 
    $language = Language::find($id);
    $language::update($request->except('_token'));
    // ... etc

删除scopeselect() 方法,您永远不应该选择表中的每条记录。另外select这个词肯定是一个保留字,试图使用一个命名的函数必然会导致问题。

【讨论】:

@abdurhman 这有帮助吗?

以上是关于方法 Illuminate\Support\Collection::find 不存在的主要内容,如果未能解决你的问题,请参考以下文章

init()方法和构造方法的区别

GroovyGroovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )

Python中静态方法和类方法的区别

类方法和实例方法

Java中的构造方法与普通方法的区别? 啥情况下用构造方法啥情况下用普通的方法

Python中静态方法和类方法的区别