вопросы пишите мне в телеграмм +375298176892
можно скачать офлайн версию сайта: code.mu old.code.mu

Изменение данных из моделей Eloquent

Вставки

По следующей ссылке изучите раздел Вставки. Решите затем следующие задачи:

В контроллере PostController, созданном в предыдущем уроке, сделайте действие newPost для создания новой статьи. Пусть это действие будет доступно по адресу /post/new/. В представлении действия покажите форму для добавления новой записи. После отправки формы сохраните новую запись.

Изменения

Метод save можно использовать и для изменения существующей модели в БД. Для изменения модели вам нужно получить ее, изменить необходимые атрибуты и вызвать метод save:

<?php $post = Post::find(1); $post->title = 'Новый заголовок записи с id 1'; $post->save(); ?>

Отметка времени updated_at будет установлена автоматически, поэтому не надо задавать ее вручную.

Сделайте какое-нибудь действие, по заходу на которое для статьи с id 1 поменяйте title и короткое описание desc.

Редактирование статьи

Давайте теперь сделаем отдельное действие для редактирования статьи. Сделаем так, чтобы при заходе на это действие показывалась форма, уже заполненная данными из базы данных.

При желании эти данные можно будет поменять и обновить их в базе данных.

Итак, сделаем в контроллере PostController действие editPost:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class PostController extends Controller { public function editPost() { return view('test.editPost'); } } ?>

В представлении действия покажем форму для редактирования статьи:

<form action="" method="POST"> <input name="title"> <input name="desc"> <input name="date"> <textarea name="text"></textarea> <input name="submit" type="submit"> </form>

Так как форма отправляется методом POST, то для маршрута, соответствующего нашему действию, разрешим как метод get, так и post:

<?php Route::match(['get', 'post'], 'post/edit/{id}', 'PostController@editPost'); ?>

Обратите внимание на то, что в адресе маршрута записан параметр id, представляющий собой id записи, редактирование которой мы осуществляем.

Давайте доработаем наш контроллер, подключив нужные классы и выполнив инъекцию класса Request, а также передав параметр id в метод действия editPost:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; // подключаем класс Request use App\Post; // подключаем модель Post class PostController extends Controller { public function editPost(Request $request, $id) { return view('test.editPost'); } } ?>

Давайте теперь сделаем так, чтобы по заходу на страницу данные записи с переданным id уже были записаны в форме.

Для этого получим запись по ее id и передадим полученные данные в представление:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; // подключаем класс Request use App\Post; // подключаем модель Post class PostController extends Controller { public function editPost(Request $request, $id) { $post = Post::find($id); // получаем запись по id return view('test.editPost', ['post' => $post]); } } ?>

Выведем переданные данные в представлении:

<form action="" method="POST"> <input name="title" value="{{ $post->title }}"> <input name="desc" value="{{ $post->desc }}"> <input name="date" value="{{ $post->date }}"> <textarea name="text">{{ $post->text }}</textarea> <input name="submit" type="submit"> </form>

Давайте теперь поймаем отправку формы. Здесь я использую хитрость: не буду проверять наличие всех полей формы, а просто проверю с помощью метода has наличие в $request поля submit. Данное имя соответствует кнопке отправки формы (я дал этой кнопке атрибут name в значении submit).

Итак, вот проверка:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Post; class PostController extends Controller { public function editPost(Request $request, $id) { $post = Post::find($id); // Если форма была отправлена... if ($request->has('submit')) { } return view('test.editPost', ['post' => $post]); } } ?>

Давайте теперь по отправке формы запишем данные формы в нашу модель и сохраним ее:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Post; class PostController extends Controller { public function editPost(Request $request, $id) { $post = Post::find($id); // Если форма была отправлена... if ($request->has('submit')) { $post->title = $request->title; $post->desc = $request->desc; $post->date = $request->date; $post->text = $request->text; $post->save(); // сохраним модель } return view('test.editPost', ['post' => $post]); } } ?>

Обратите внимание на то, что после попадания в иф, поля нашей модели $post изменятся и уже в измененном виде попадут в представление - то есть в форме после ее отправки уже будут стоять не изначальные значения из БД, а те, которые вбил пользователь. Вот такой хитрый прием.

Сделайте самостоятельно описанное мною редактирование статьи.

Отредактируйте представление действия getAll так, чтобы появилась еще одна колонка со ссылкой на редактирование соответствующей статьи.

Модифицируйте код действия editPost так, чтобы после сохранения формы выполнялся редирект на список всех записей (то есть на действие getAll).

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

Модифицируйте предыдущую задачу так, чтобы во флеш сообщении был указан id и title статьи, подвергнувшейся изменению.

Массовые изменения

По следующей ссылке изучите раздел Массовые изменения.

Самостоятельно опробуйте изученную теорию.

Другие методы создания

По следующей ссылке изучите раздел Другие методы создания. Решите затем следующие задачи:

Самостоятельно опробуйте изученную теорию.