我有两个模型:User
和Form
。 Form
模型有两个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);
}
}
答案 0 :(得分:3)
对于Laravel,您可能会遇到名称空间分辨率与相对名称空间类引用App\User
和App\Form
的问题。
默认情况下,此目录在App下命名,并由Composer使用PSR-4自动加载标准自动加载。您可以使用app:name Artisan命令更改此命名空间。
- 相对名称始终解析为名称,其名称空间由当前名称空间替换。如果名称出现在全局名称空间中,则会剥离名称空间\前缀。例如,命名空间\内部命名空间X \ Y解析为X \ Y \ A.全局命名空间中的相同名称解析为A。
醇>
尝试在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');
}
}
然后一切正常(重新启动工匠修补匠后)。