我在 Laravel 项目中使用 php artisan make:auth
命令生成了一个注册表单。我想通过添加用户可以在注册时选择性别的功能来进行一些自定义。我创建了一个带有性别列(包含两个值:男和女)的性别表,并添加了带有 gender_id 和 user_id 列的 gender_user 表。我建立了多对多的关系,但当我尝试注册用户时,出现了错误:
Method Illuminate\Database\Eloquent\Collection::genders does not exist.
它会将用户写入users表,但不会在gender_user表中进行任何写入。我的关系已经过测试,当我尝试从另一个控制器获取带有性别关系的用户时,它可以工作。感谢您的任何帮助。这是我的代码。
RegisterController.php
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
protected $redirectTo = '/home';
public function __construct()
{
$this->middleware('guest');
}
protected function validator(array $data)
{
return Validator::make($data, [
'genders' => ['required', 'string', 'max:255'],
/* 'gender_id' => 'required|exists:mysql.genders,id',
'user_id' => 'required|exists:mysql.users,id', */
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'age' => ['required', 'integer', 'min:18'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
protected function create(array $data)
{
$genders = DB::table('genders')
->whereIn(
'genders',
[
request()->genders
]
)
->pluck('id')
->toArray();
//dd($genders);
$user = User::create([
//'genders' => $data['genders'],
'name' => $data['name'],
'email' => $data['email'],
'age' => $data['age'],
'password' => Hash::make($data['password']),
]);
//dd($user);
$newUser = User::find($user);
$newUser->genders()->attach($genders);
dd($newUser);
return User::find($user);
}
}
User.php
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password', 'age',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function genders()
{
return $this->belongsToMany(Gender::class, 'gender_user', 'user_id', 'gender_id');
}
public function userProfile()
{
return $this->hasOne(UserProfile::class);
}
public function photos()
{
return $this->hasMany(Photo::class, 'user_id', 'id');
}
}
Gender.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Gender extends Model
{
public function users()
{
return $this->belongsToMany(User::class, 'gender_user', 'gender_id', 'user_id');
}
}
gender_user表
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateGenderUserTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('gender_user', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('gender_id')->nullable();
$table->foreign('gender_id')->references('id')
->on('genders')->onDelete('cascade');
$table->unsignedBigInteger('user_id')->nullable();
$table->foreign('user_id')->references('id')
->on('users')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('gender_user');
}
}
性别表
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateGendersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('genders', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('genders');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('genders');
}
}
register.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Register') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('register') }}">
@csrf
<div class="form-group row">
<label for="genders" class="col-md-4 col-form-label text-md-right">{{ __('Genders') }}</label>
<div class="col-md-6">
<select id="genders" class="form-control @error('genders') is-invalid @enderror" name="genders" value="{{ old('genders') }}" required autocomplete="genders">
<option value="Woman">Woman</option>
<option value="Woman Looking For Woman">Woman Looking For Woman</option>
<option value="Man">Man</option>
</select>
@error('genders')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>
<div class="col-md-6">
<input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
@error('name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="age" class="col-md-4 col-form-label text-md-right">{{ __('Age') }}</label>
<div class="col-md-6">
<select id="age" class="form-control @error('age') is-invalid @enderror" name="age" value="{{ old('age') }}" required autocomplete="age">
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
</select>
@error('age')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Register') }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
$newUser = User::find($user);
?你的模型已经在$user
中了。 - MrEvershasOne
关联,因为多个用户可以拥有相同的性别。在注册用户时,只需将性别 ID 保存在用户表中即可。 - zahid hasan emon