我在我的应用中清理代码。似乎我对::class
符号有误解。
虽然在我的config/app.php
提供者中声明可以从此说明:'igaster\laravelTheme\themeServiceProvider',
转换为此
igaster\laravelTheme\themeServiceProvider::class,
,我不能对模型中的对象做同样的事情。
例如,我有
public function relateds()
{
return $this->hasMany('App\Models\Related', 'item_id')->Where('itemkind', '=', 'capacitytypes', 'and')->Where('status', '!=', '2');
}
转换成
后public function relateds()
{
return $this->hasMany(App\Models\Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2');
}
我收到错误
FatalThrowableError in Model.php line 918:
Class 'App\Models\App\Models\Action' not found
这是否意味着我不能在模型中使用符号,或者我做错了?
答案 0 :(得分:2)
在此上下文中,命名空间的行为有点像文件路径,因为当您在整个代码中引用一个时,您可以相对地引用它们(与当前命名空间相关)或绝对(完全命名空间)。
当您处于与此类名称相同的文件中时,如果您省略了前导\
字符,那么您将相对引用。这就是为什么它正在寻找App\Models\App\Models\Action
。
文件config/app.php
未命名,因此您提供的任何命名空间都假定为相对于根命名空间,因此您不需要前导\
字符。
作为参考,您可以采取一些措施来解决问题。
首先,正如评论中所建议的那样,您可以在开头添加\
,以便它变为:
public function relateds()
{
return $this->hasMany(\App\Models\Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2');
}
其次,您可以use
文件顶部的类,就在命名空间声明之后,然后在定义关系时省略完整的命名空间,如下所示:
<?php
namespace App\Models;
use App\Models\Related;
class Action extends Model
{
// ...
public function relateds()
{
return $this->hasMany(Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2');
}
最后更简单地说,由于您的Related
和Action
模型都在同一个App\Models
命名空间中,因此在定义关系时可以完全省略命名空间,而无需到顶部use
。所以你最终会得到这个:
public function relateds()
{
return $this->hasMany(Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2');
}