@vladimirr89

Как поставить slug в laravel 5.5 без применения сторонних решений?

Подскажите как в данном контроллере сделать так, чтобы slug автоматически добавлялся в базу, а не выскакивала ошибка:
SQLSTATE[HY000]: General error: 1364 Field 'slug' doesn't have a default value (SQL: insert into `posts` (`title`, `date`, `description`, `content`, `user_id`, `updated_at`, `created_at`) values (Статья 4444, 2018-03-04, <p>Супер статья которая не опубликуется</p>, <p>Полюбому не опубликуется</p>, 10, 2018-03-03 21:36:45, 2018-03-03 21:36:45))


Хочу отметить, что понаходил кучу разной информации, но нигде нет конкретики. Просто тупо
$title = str_slug('Laravel 5 Framework', '-');
Грубо говоря, все сводится к данной строке или к еще более старым непонятным вариантм. Но куда её вставить чтобы она работала в моем конкретном случае? Как бы я ни пытался какие комбинации и хитрости делать, ничего не выходит.

Необходимо, чтобы title преобразовывался в slug и к нему прибавлялся id статьи.
По принципу примерно такому:
if (empty(Post::find(DB::table('posts')->max('id'))))
        $last_id = 0;
    else
        $last_id = Post::find(DB::table('posts')->max('id'))->id;
        $last_id++;
        'slug' => str_slug($title['title']) . "-" . $last_id,


Вот собственно код контроллера статей:
<?php
 
namespace App\Http\Controllers\Admin;
 
use App\Post;
use App\Chainword;
use App\Category;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
 
class PostsController extends Controller
{
    public function index()
    {
        $posts = Post::all();
        return view('admin.posts.index', ['posts'=>$posts]);
    }
 
    public function create()
    {
        $categories = Category::pluck('title', 'id')->all();
        $chainwords = Chainword::pluck('title', 'id')->all();
 
        return view('admin.posts.create', compact(
            'categories',
            'chainwords'
        ));
 
    }
 
    public function store(Request $request)
    {
      $this->validate($request, [
            'title' =>'required',
            'content' => 'required',
            'date' => 'required',
            'image' => 'nullable|image'
        ]);

        $post = Post::add($request->all());
        $post->uploadImage($request->file('image'));
        $post->setCategory($request->get('category_id'));
        $post->setChainwords($request->get('chainwords'));
        $post->toggleStatus($request->get('status'));
        $post->toggleFeatured($request->get('is_featured'));
 
        return redirect()->route('posts.index');
    }
 
    public function edit($id)
    {
        $post = Post::find($id);
        $categories = Category::pluck('title', 'id')->all();
        $chainwords = Chainword::pluck('title', 'id')->all();
        $selectedChainwords = $post->chainwords->pluck('id')->all();
 
        return view('admin.posts.edit', compact(
            'categories',
            'chainwords',
            'post',
            'selectedChainwords'
        ));
    }
 
    public function update(Request $request, $id)
    {
        $this->validate($request, [
            'title' =>'required',
            'content' => 'required',
            'date' => 'required',
            'image' => 'nullable|image'
        ]);
 
        $post = Post::find($id);
        $post->edit($request->all());
        $post->uploadImage($request->file('image'));
        $post->setCategory($request->get('category_id'));
        $post->setChainwords($request->get('chainwords'));
        $post->toggleStatus($request->get('status'));
        $post->toggleFeatured($request->get('is_featured'));
 
        return redirect()->route('posts.index');
    }
 
    public function destroy($id)
    {
        Post::find($id)->remove();
        return redirect()->route('posts.index');
    }
}
  • Вопрос задан
  • 285 просмотров
Пригласить эксперта
Ответы на вопрос 1
dark_tke
@dark_tke
Помогли? Отметь решением!
Смотрите, у вас в коде НИГДЕ не идет создание слага, если вы не хотите менять особо исходный код, что уже написан, используйте события, https://laravel.com/docs/5.6/events? ставите обработчик на момент создания, и получаете то, что вам нужно. При этом слаг будет добавляться или обновляться при любом изменении через ORM

Второй же вариант, это делать вызов создания слага в процессе создание и реактирования например
$post->slug = str_slug('Laravel 5 Framework', '-');
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы