我正在使用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,所以这可能非常明显/简单,但任何帮助都会受到赞赏。)
答案 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;
});