附加$ id以在Laravel中创建post slug

时间:2018-04-16 15:48:26

标签: php laravel slug laravel-5.6

我正在使用Laravel从表单创建博客文章,并将标题和正文传递到create中的PostsController方法。

slug必须是唯一的,所以虽然以下工作,但是当我使用重复的标题时它会失败。

我打算将$post->id附加到slug,因此this-is-the-post-title将成为this-is-the-post-title-12

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;
use Session;
use Carbon\Carbon;

class PostController extends Controller
{
  public function store(Request $request) {
  $this->validate($request, [
    'title' => 'required|max:255',
    'body'  => 'required'
  ]);

  $post = new Post;
  $post->title = $request->input('title');
  $post->body = $request->input('body');
  $post->slug = str_slug($request->input('title'), '-');
  $post->save();

  Session::flash('success', 'The blog post was successfully saved!');

  return redirect()->route('posts.show', $post->id);
}

我最初的想法是将$post->id连接到slug的末尾,但它不起作用。

我认为这是因为在id之前未分配save()

有没有办法获得将要使用的ID?

我想过只返回数据库中的行数,然后添加一行,但如果两个人同时发布,则会失败。

(我对Laravel很新,并自学PHP,所以这可能非常明显/简单,但任何帮助都会受到赞赏。)

1 个答案:

答案 0 :(得分:2)

先保存然后再更新:

$post = \DB::transaction(function() use($request) {
    $post = new Post;
    $post->title = $request->input('title');
    $post->body = $request->input('body');
    $post->slug = uniqid(); //to avoid unique column conflict, it will be overwritten
    $post->save();

    $post->slug = str_slug($request->input('title').' '.$post->id, '-');
    $post->save();

    return $post;
});