Laravel Eloquent的关系 - 奇怪的道路

时间:2016-12-01 16:13:07

标签: php laravel eloquent

我有两个模型:UserFormForm模型有两个belongsTo关系:

class Form extends Model
{

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function manager_user()
    {
        return $this->belongsTo(User::class, 'manager_id');
    }
}

manager_id是一个可以为空的整数列。

使用工匠修补匠,我尝试将用户指定为表单的管理员(使用these methods):

$manager = App\User::findOrFail(1);
$form = App\Form::findOrFail(1);
$form->manager_user()->assign($manager);

但我收到错误:

$form->manager_user()->associate($gacek)
PHP Fatal error:  Class 'App\App\User' not found in /var/www/html/test/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 779                                                     

[Symfony\Component\Debug\Exception\FatalErrorException]  
Class 'App\App\User' not found   

我做错了什么?为什么框架会尝试搜索App\App\User而不是App\User

这是Laravel 5.3的全新安装。

修改 带名称空间的完整模型文件:

Form型号:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Form extends Model
{
public function user(){
    return $this->belongsTo("App\User");
}

public function manager_user(){
    return $this->belongsTo("App\User", 'manager_id');
}
} 

User型号:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
use Notifiable;

protected $fillable = [
    'name', 'email', 'password', 'surname', 'login', 'sign'
];

protected $hidden = [
    'password', 'remember_token',
];

public function forms(){
    return $this->hasMany(Form::class);
}
}

2 个答案:

答案 0 :(得分:3)

对于Laravel,您可能会遇到名称空间分辨率与相对名称空间类引用App\UserApp\Form的问题。

  

默认情况下,此目录在App下命名,并由Composer使用PSR-4自动加载标准自动加载。您可以使用app:name Artisan命令更改此命名空间。

From Laravel Docs

  
      
  1. 相对名称始终解析为名称,其名称空间由当前名称空间替换。如果名称出现在全局名称空间中,则会剥离名称空间\前缀。例如,命名空间\内部命名空间X \ Y解析为X \ Y \ A.全局命名空间中的相同名称解析为A。
  2.   

来自Namespace Resolution rules

尝试在App\User类引用之前删除Form命名空间声明,或者将其添加到另一个\前面,以使它们完全合格。

答案 1 :(得分:0)

正如@Kevin Stitch所说,我遇到了相对命名空间的问题。

在我的Form模型中,我调整了关系以获得绝对路径:

class Form extends Model
{
public function user(){
    return $this->belongsTo("\App\User");
}

public function manager_user(){
    return $this->belongsTo("\App\User", 'manager_id');
}
}

然后一切正常(重新启动工匠修补匠后)。