Я создал таблицу профилей с «данными о пользователе», эта таблица связана с пользователем. Он работал нормально, пока вдруг таблица профилей не будет создавать никаких строк после регистрации. Я проверял свой код несколько раз и даже сравнивал свой последний работающий git. Профиль и пользовательские классы, похоже, в порядке. У меня нет ошибок перенаправления страницы, но строка профиля не создана, не имеет идентификатора. Что еще может пойти не так, что таблица не создаст? Как я могу отладить это? Класс профиля:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
class Profile extends Model
{
use HasFactory;
public function user(){
return $this->belongsTo(User::class);
}
/**
* Get user age.
*/
public function get_age()
{
return Carbon::parse($this->attributes['birthdate'])->age;
}
}
Класс пользователя
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'username',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function profile(){
return $this->hasOne(Profile::class);
}
}
Таблица профиля:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateProfilesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->unsignedBigInteger('user_id');
$table->string("user_name")->nullable();
$table->string("familyname")->nullable();
$table->string("location")->nullable();
$table->string("gender")->nullable();
$table->date("birthdate")->nullable();
$table->string("favorite_sport")->nullable();
$table->string("biography")->nullable();
$table->string("profil_photo")->nullable();
$table->index("user_id");
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('profiles');
}
}
Зарегистрировать контроллер:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
class RegisterController extends Controller
{
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'username' => ['required', 'string', 'max:255', 'unique:users'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\Models\User
*/
protected function create(array $data)
{
return User::create([
'username' => $data['username'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
protected function registered(Request $request, $user)
{
return redirect(route('profile.edit', $user->username));
}
}
Контроллер профиля
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class ProfilesController extends Controller
{
/**
* Show the application dashboard.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function index( $username )
{
return view('profiles.index', [ 'user' => $username ]);
}
public function edit( $username )
{
return view('profiles.edit', [ 'user' => $username ]);
}
}
веб.php
/**
* Routes User Profile
*/
Route::get('/profiles/{username}', [App\Http\Controllers\ProfilesController::class, 'index'])->name('profile.show');
Route::get('/profiles/{username}/edit', [App\Http\Controllers\ProfilesController::class, 'edit'])->name('profile.edit');
Код отсутствует. Как видите, я новичок в Laravel. Так что я не совсем понимаю все концепции. Я следил за этим руководством в репозитории связь: связь они также не использовали метод create(). Это похоже на то, что hasOne и ownTo сделали свою работу (хотя они используют метод обновления). Где я должен разместить метод create() внутри RegisterController, пользователя или профиля?
Таблица не создается? Это должно быть сделано в миграции
Сначала вы должны бежать
php artisan migrate
чтобы перенести весь дизайн вашей базы данных в саму базу данных. Это похоже на запуск таблицы SQL для создания кода в вашей базе данных.
Все создания ресурсов должны быть сделаны разработчиком. Как и в методе create контроллера Register.
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\Models\User
*/
protected function create(array $data)
{
return User::create([
'username' => $data['username'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
В коде вы видите, что он возвращает созданного пользователя. Однако вам также необходимо создать профиль. Если вы измените свой метод на это:
$user = User::create([
'username' => $data['username'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
$user->profile()->create(['user_name' => $user->username]);
return $user;
Он создаст пользователя и сделает соответствующую запись профиля для этого пользователя.
Он скопировал твой ответ и принял свой вместо твоего...
Вы правы, я этого не видел. Скоро некому будет помочь этим парням.
Я исправил эту проблему, добавив Profile::create внутри функции создания в Register Controller.
protected function create(array $data)
{
$user = User::create([
'username' => $data['username'],
'email' => $data['email'],
'new_user' => true,
'password' => Hash::make($data['password']),
]);
Profile::create(['user_id' => $user->id]);
return $user;
}
Я также объявил $fillable в модели профиля:
protected $fillable = [
'user_id',
];
Почему ты не принял ответ @gguney?!!
И как вы ожидаете, что будет создана модель профиля, если в методе
create()
нет связанного кода? Вы забыли добавить сюда код?