Laravel не будет создавать таблицу профилей после регистрации пользователя

Я создал таблицу профилей с «данными о пользователе», эта таблица связана с пользователем. Он работал нормально, пока вдруг таблица профилей не будет создавать никаких строк после регистрации. Я проверял свой код несколько раз и даже сравнивал свой последний работающий 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');

И как вы ожидаете, что будет создана модель профиля, если в методе create() нет связанного кода? Вы забыли добавить сюда код?

Luciano 20.03.2022 09:20

Код отсутствует. Как видите, я новичок в Laravel. Так что я не совсем понимаю все концепции. Я следил за этим руководством в репозитории связь: связь они также не использовали метод create(). Это похоже на то, что hasOne и ownTo сделали свою работу (хотя они используют метод обновления). Где я должен разместить метод create() внутри RegisterController, пользователя или профиля?

uziixd 20.03.2022 09:48

Таблица не создается? Это должно быть сделано в миграции

brombeer 20.03.2022 09:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
3
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сначала вы должны бежать

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;

Он создаст пользователя и сделает соответствующую запись профиля для этого пользователя.

Он скопировал твой ответ и принял свой вместо твоего...

medilies 26.03.2022 17:13

Вы правы, я этого не видел. Скоро некому будет помочь этим парням.

gguney 26.03.2022 17:18

Я исправил эту проблему, добавив 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?!!

medilies 26.03.2022 17:13

Другие вопросы по теме