Laravel CRUD объяснение - PullRequest
       10

Laravel CRUD объяснение

0 голосов
/ 25 апреля 2018

В моем приложении у меня есть связь между пользователем и профилем и профилем и пользователем, отношение один к одному.Это так, чтобы к отношениям можно было получить доступ из любой модели.

public function profile()
{
    return $this->hasOne(Profile::class, 'user_username');
}

public function user()
{
    return $this->belongsTo('App\User', 'user_username', 'username');
}

По сути, вы можете получить доступ к отношениям, ссылаясь на метод, который определяет отношения.

Так что я мог бы сделать либо $user->profileили $profile->user для получения любой связанной информации.

Когда пользователь заходит на определенную страницу, он должен иметь возможность просматривать и редактировать свой профиль, поэтому я определил маршрут GET и POST.

У меня есть маршруты, подобные следующим:

Route::get('/profile_edit/{user}','Editable\ProfileController@edit');
Route::post('/profile_edit/{user}','Editable\ProfileController@update');

Отображение формы

public function edit(User $user)
{    
   return view('editable.people.profile', compact('user'));
}

Этот метод получает информацию о профиле путем поиска в таблице пользователей по заданному шаблону, поэтому он по сути делает SELECT * FROM {wildcard}.

Обновление профиля

В ProfileController метод автоматически генерируется при запуске ресурса в качестве контроллера ресурсов.

public function update(Request $request, Profile $profile)
{
    // ...
}

Причина, по которой япроблема в том, что многие примеры маршрутов, которые я видел, удобочитаемы для человека и имеют смысл с простой точки зрения CRUD, как показано ниже:

/posts -> show all posts
/posts{id} -> get a post by ID
/posts{id}/update -> get a post by ID and go to the update script

Если я не хочу использовать много слагов в URLесть ли способ просто получить профиль от пользователя и затем обновить его?

В приведенном мною примере

public function update(Request $request, Profile $profile)

Метод ищетэкземпляр профиля, но так как мой URL-адрес не /edit/{profile}, мне даже нужно передать второй параметр?

Могу ли я не просто сделать следующее?

 public function update(Request $request, Profile $profile)
{
    $user = App\User::find($request->username);
    $profile = Profile::where('user_username', $user->username);

    $profile->background = $request->get('background');
    $profile->skills = $request->get('skills');
    $profile->user_username = $profile->user->username;

   $profile->save();
}

1 Ответ

0 голосов
/ 25 апреля 2018

Предполагая, что вы правильно установили отношение Eloquent One-to-One (с помощью миграции и модели); и скажем, что после реализации функции просмотра / редактирования профиля для аутентифицированного пользователя вы можете сделать что-то вроде этого:

Маршруты

Route::get('profile_edit', 'ProfileController@view');
Route::post('profile_edit', 'ProfileController@update');

Контроллер

public function view()
{
    $profile = auth()->user()->profile;

    return return view('editable.people.profile', compact('profile'));
}

public function update(Request $request)
{
    // don't forget to do request validation here...

    $user = auth()->user();
    $profile = $user->profile;

    if (!$profile) {
        $profile = new Profile();
        $profile->user_id = $user->id;
    }

    $profile->background = $request->get('background');
    $profile->skills = $request->get('skills');
    $profile->user_username = $user->username;

    $profile->save();

    // redirect or set success etc...
}

Однако, если вы работаете с точки зрения администратора, когда администратор хочет просмотреть или отредактировать профиль известного пользователя, вы можете сделать что-то подобное, используя готовую загрузку:

Маршруты

Route::get('profile_edit/{user_id}', 'ProfileController@view');
Route::post('profile_edit/{user_id}', 'ProfileController@update');

Контроллер

public function view($user_id)
{
    $user = User::where('id', $user_id)->with('profile')->first();

    if (!$user) {
        throw new Exception('User with id '. $user_id .' does not exist.');
    }

    $profile = $user->profile;

    return return view('editable.people.profile', compact('profile'));
}

public function update($user_id, Request $request)
{
    // don't forget to do request validation here...

    $user = User::where('id', $user_id)->with('profile')->first();

    if (!$user) {
        throw new Exception('User with id '. $user_id .' does not exist.');
    }

    $profile = $user->profile;

    if (!$profile) {
        $profile = new Profile();
        $profile->user_id = $user->id;
    }

    $profile->background = $request->get('background');
    $profile->skills = $request->get('skills');
    $profile->user_username = $user->username;

    $profile->save();

    // redirect or set success etc...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...