方法 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()
过滤它,这是QueryBuilder
s 上的一个方法。
您可以按照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 不存在的主要内容,如果未能解决你的问题,请参考以下文章
GroovyGroovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )