我可以在模型函数中使用`:: class`表示法 - Laravel

时间:2016-08-12 22:17:04

标签: php class laravel laravel-5.2

我在我的应用中清理代码。似乎我对::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

这是否意味着我不能在模型中使用符号,或者我做错了?

1 个答案:

答案 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');
        }
    
  • 最后更简单地说,由于您的RelatedAction模型都在同一个App\Models命名空间中,因此在定义关系时可以完全省略命名空间,而无需到顶部use。所以你最终会得到这个:

    public function relateds()
    {
        return $this->hasMany(Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2');
    }