Laravel 从数据库中获取 Slug
Laravel Get Slug from Database
我正在尝试使用最新版本的 laravel 构建一个类似博客的应用程序。我试图弄清楚如何从数据库中为每篇文章提取一个 slug,然后将其正确路由到所有工作。
我已经可以正常使用了,但是如果您使用 slug 查看文章,内容将不会显示在文章中。
localhost/articles/1 - 工作正常,内容显示在页面上(标题等)
localhost/articles/installing-example - 这有效,但内容错误
当您尝试使用数据库中的 slug 导航到页面时会发生这种情况:Trying to get property 'title' of non-object (View: C:\xampp\htdocs\blogtest\resources\views\articles\show.blade.php)
此行错误:<h1><?php echo e($articles->title); ?></h1>
app/http/controllers/ArticlesController:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Article;
class ArticlesController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$articles = Article::all();
return view('articles.index')->with('articles', $articles);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$articles = Article::find($id);
return view('articles.show')->with('articles', $articles);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
app/Article.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
protected $table = 'articles';
public $primaryKey = 'id';
public $timestamps = true;
}
routes/web.php
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::resource('articles', 'ArticlesController');
resources\views\articles\show.blade.php
@extends('layouts.master')
@section('content')
<h1>{{$articles->title}}</h1>
@endsection
数据库
如有任何帮助和建议,我们将不胜感激。
您需要在模型中设置路由键
// Article model
public function getRouteKeyName(){
return 'slug';
}
试试这个
没有鼻涕虫
路线
Route::resource('articles', 'ArticlesController');
/文章/{id}
控制器
public function show($id)
{
$articles = Article::first($id);
return view('articles.show', compact('articles'));
}
Blade
@extends('layouts.master')
@section('content')
@if(!is_null($articles))
<h1>{{$articles->title}}</h1>
@endif
@endsection
有鼻涕虫
路线
Route::get('/articles/{slug}', ['as'=>'articles.by.slug', 'uses'=> 'ArticlesController@showArticles']);
or
Route::get('/articles/{slug}', 'ArticlesController@showArticles')->name('articles.by.slug');
/文章/{鼻涕虫}
控制器
public function showArticles($slug)
{
$articles = Article::where('slug', $slug)->first();
return view('articles.show', compact('articles'));
}
Blade
@extends('layouts.master')
@section('content')
@if(!is_null($articles)) //or @if($articles)
<h1>{{$articles->title}}</h1>
@endif
@endsection
Trying to get property 'title' of non-object (View: C:\xampp\htdocs\blogtest\resources\views\articles\show.blade.php)
暗示 $articles
不是一个对象,如果你转储它,它应该输出 null
- 非常正确。
find
函数用于使用您的主键查找行,而您的主键不是您的 slug
列,因此找不到记录。
您需要设置一个路由来接受 {slug}
,然后根据您需要进行以下更改的 slug:
$articles = Article::find($id);
给,
$articles = Article::where('slug', $slug)->first();
并确保 $slug
是实际的 slug
而不是 id
列值。
这是因为您从数据库中获取了空数据。
原因是,您在 id 字段中传递了 slug,所以
localhost/articles/installing-example
你传递了 id = installing-example,因此没有找到 id,所以你没有得到任何数据。
所以对于这个
将您的 slud 转换为原始形式并且不使用 id 进行搜索,而是使用您的 slug 字段进行搜索。
让我们从标题中假设您制作了 slug。
标题是 installing example
所以当你得到鼻涕虫时,把它变成原来的样子
然后用原来的like
搜索
$articles = Article::where('titile',$original)->first();
我正在尝试使用最新版本的 laravel 构建一个类似博客的应用程序。我试图弄清楚如何从数据库中为每篇文章提取一个 slug,然后将其正确路由到所有工作。
我已经可以正常使用了,但是如果您使用 slug 查看文章,内容将不会显示在文章中。
localhost/articles/1 - 工作正常,内容显示在页面上(标题等)
localhost/articles/installing-example - 这有效,但内容错误
当您尝试使用数据库中的 slug 导航到页面时会发生这种情况:Trying to get property 'title' of non-object (View: C:\xampp\htdocs\blogtest\resources\views\articles\show.blade.php)
此行错误:<h1><?php echo e($articles->title); ?></h1>
app/http/controllers/ArticlesController:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Article;
class ArticlesController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$articles = Article::all();
return view('articles.index')->with('articles', $articles);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$articles = Article::find($id);
return view('articles.show')->with('articles', $articles);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
app/Article.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
protected $table = 'articles';
public $primaryKey = 'id';
public $timestamps = true;
}
routes/web.php
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::resource('articles', 'ArticlesController');
resources\views\articles\show.blade.php
@extends('layouts.master')
@section('content')
<h1>{{$articles->title}}</h1>
@endsection
数据库
如有任何帮助和建议,我们将不胜感激。
您需要在模型中设置路由键
// Article model
public function getRouteKeyName(){
return 'slug';
}
试试这个
没有鼻涕虫
路线
Route::resource('articles', 'ArticlesController');
/文章/{id}
控制器
public function show($id)
{
$articles = Article::first($id);
return view('articles.show', compact('articles'));
}
Blade
@extends('layouts.master')
@section('content')
@if(!is_null($articles))
<h1>{{$articles->title}}</h1>
@endif
@endsection
有鼻涕虫
路线
Route::get('/articles/{slug}', ['as'=>'articles.by.slug', 'uses'=> 'ArticlesController@showArticles']);
or
Route::get('/articles/{slug}', 'ArticlesController@showArticles')->name('articles.by.slug');
/文章/{鼻涕虫}
控制器
public function showArticles($slug)
{
$articles = Article::where('slug', $slug)->first();
return view('articles.show', compact('articles'));
}
Blade
@extends('layouts.master')
@section('content')
@if(!is_null($articles)) //or @if($articles)
<h1>{{$articles->title}}</h1>
@endif
@endsection
Trying to get property 'title' of non-object (View: C:\xampp\htdocs\blogtest\resources\views\articles\show.blade.php)
暗示 $articles
不是一个对象,如果你转储它,它应该输出 null
- 非常正确。
find
函数用于使用您的主键查找行,而您的主键不是您的 slug
列,因此找不到记录。
您需要设置一个路由来接受 {slug}
,然后根据您需要进行以下更改的 slug:
$articles = Article::find($id);
给,
$articles = Article::where('slug', $slug)->first();
并确保 $slug
是实际的 slug
而不是 id
列值。
这是因为您从数据库中获取了空数据。
原因是,您在 id 字段中传递了 slug,所以
localhost/articles/installing-example
你传递了 id = installing-example,因此没有找到 id,所以你没有得到任何数据。
所以对于这个 将您的 slud 转换为原始形式并且不使用 id 进行搜索,而是使用您的 slug 字段进行搜索。
让我们从标题中假设您制作了 slug。
标题是 installing example
所以当你得到鼻涕虫时,把它变成原来的样子
然后用原来的like
$articles = Article::where('titile',$original)->first();