Php 用户id和用户名未与关系一起插入

Php 用户id和用户名未与关系一起插入,php,laravel,Php,Laravel,这是乡村模式 class Country extends Model { protected $guarded = []; public function posts() { return $this->hasManyThrough(Post::class,UserProfile::class,'country_id','user_id','id','user_id'); } } 这是控制器 class UserController ex

这是乡村模式

class Country extends Model
{
    protected $guarded = [];

    public function posts()
    {
        return $this->hasManyThrough(Post::class,UserProfile::class,'country_id','user_id','id','user_id');
    }
}
这是控制器

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $users = \App\User::with(['roles','profile'])->get();
        return view('dashboard.users.index',compact('users'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
        $roles = \App\Role::all();
        $countries = \App\Country::all();
        return view('dashboard.users.create',compact('countries','roles'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {

        $user = [
            'username' => $request->username,
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password),
        ];
        $user = \App\User::create($user);
               $filename = sprintf('thumbnail_%s.jpg',random_int(1, 1000));
        if ($request->hasFile('photo')) 
         $filename = $request->file('photo')->storeAs('profiles',$filename,'public');
     else
        $filename = "profiles/dummy.jpg";
    if ($user) {
        $profile = new \App\UserProfile([
            'user_id' => $user->id,
            'city' => $request->city,
            'country_id' => $request->country,
            'photo' => $filename,
            'phone' => $request->phone,
        ]);
        $user->profile()->save($profile);
        $user->roles()->attach($request->roles);
        return redirect()->route('users.index');
    }

}
这是用户配置文件模型

class UserProfile extends Model
{
    protected $guarded = [];

    public function user()
    {
        return $this->belongsTo(User::class,'user_id','id');
    }
    public function country()
    {
        return $this->belongsTo(Country::class,'country_id','id');
    }
}
@extends('dashboard.layout'))
@节(“内容”)
@csrf
名称
全名
电子邮件
密码
电话
选择国家
@如果(!$countries->isEmpty())
@foreach($国家作为$国家)
{{$country->name}
@endforeach
@恩迪夫
城市
选择角色
@如果(!$roles->isEmpty())
@foreach($roles作为$role)
{{$role->name}
@endforeach
@恩迪夫
轮廓图像
添加新用户
@端部
这是创建视图

我在创建用户并获取此错误SQLSTATE[23000]时已将此代码用于关系:完整性约束冲突:1048列“用户id”不能为空(SQL:insert into
user\u profiles
user\u id
city
country\u id
photo
phone
updated\u at
created\u at
)值(?,卡拉奇,1,profiles/thumbnail\u 385.jpg,+9231487909842020-02-20 04:49:172020-02-20 04:49:17))试试这个:
您的
用户
型号具有:

    public function store(Request $request)
    {

        $filename = sprintf('thumbnail_%s.jpg', random_int(1, 1000));

        if ($request->hasFile('photo'))
            $filename = $request->file('photo')->storeAs('profiles', $filename, 'public');
        else
            $filename = "profiles/dummy.jpg";

        $user = \App\User::create([
            'username' => $request->username,
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password),
        ])->profile()->create([
            'city' => $request->city,
            'country_id' => $request->country,
            'photo' => $filename,
            'phone' => $request->phone,
        ]);

        if ($user) {
            $user->roles()->attach($request->roles);
            return redirect()->route('users.index');
        } else {
            //redirect to error page
        }
    }
然后,控制器执行以下操作:

protected $fillable = [
    'name', 'email', 'password',
];
这将失败,因为
用户名
不可批量分配。如文档所述,将只接受您在
$filleble
中明确列出的字段

要使其工作,您需要将
用户名
添加到可填充字段列表中:

$user = [
    'username' => $request->username,
    'name' => $request->name,
    'email' => $request->email,
    'password' => bcrypt($request->password),
];
$user = \App\User::create($user);
旁注:您为确保在尝试创建配置文件之前创建了用户而设置的测试/错误处理无效。原因是您首先将
$user
设置为数组-
create()
失败,但
$user
仍然是数组。因此,您的测试:

protected $fillable = [
    'username', 'name', 'email', 'password',
];
仍然计算为
TRUE
。最好使用不同的变量名设置用户数组,例如:

if ($user) {
    // $user is an array so this still works
    // create user profile
}
或者更简单的是,在一个命令中完成所有操作:

$array = [ ... user values ... ];
$user = \App\User::create($array);

@Hammad有我的回答帮助吗?请看。不需要传递用户ID,因为我们在包装主模型的同时直接创建相关模型。Eloquent将知道根据模型关系声明自动传递用户ID,但用户ID不会插入
if ($user) {
    // $user is an array so this still works
    // create user profile
}
$array = [ ... user values ... ];
$user = \App\User::create($array);
$user = \App\User::create([
    // ... user values ...
]);