Laravel从数据库中获取子弹

时间:2019-03-25 10:45:52

标签: php laravel controller routes slug

我正在尝试使用最新版本的laravel构建类似博客的应用程序。我试图弄清楚如何从数据库中为每篇文章拉出一条子弹,然后将其路由到所有正常工作的地方。

我已经可以使用它了,但是如果您使用子弹查看它,内容将不会显示在文章上。

localhost / articles / 1-工作正常,内容显示在页面上(标题等)

localhost / articles / installing-example-可以,但是内容错误

当您尝试使用来自数据库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

数据库 https://i.imgur.com/uNyrZw8.png

任何帮助和建议将不胜感激。

4 个答案:

答案 0 :(得分:3)

Trying to get property 'title' of non-object (View: C:\xampp\htdocs\blogtest\resources\views\articles\show.blade.php)

暗示$articles不是对象,如果转储它,它应该输出null-非常正确。

find函数将用于通过主键查找行,而主键不是slug列,因此无法找到记录。

您需要设置一个接受{slug}的路由,然后根据该标签进行以下更改:

$articles = Article::find($id);

收件人

$articles = Article::where('slug', $slug)->first();

并确保$slug是实际的slug,而不是id列的值。

答案 1 :(得分:1)

尝试一下

没有弹

路线

Route::resource('articles', 'ArticlesController');

/ article / {id}

控制器

public function show($id)
{
    $articles = Article::first($id);
    return view('articles.show', compact('articles'));
}

刀片

@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');

/ article / {slug}

控制器

public function showArticles($slug)
{
    $articles = Article::where('slug', $slug)->first();
    return view('articles.show', compact('articles'));
}

刀片

@extends('layouts.master')

@section('content')
    @if(!is_null($articles)) //or @if($articles)
        <h1>{{$articles->title}}</h1>
    @endif
@endsection

答案 2 :(得分:0)

您需要在模型中设置路由键

// Article model
public function getRouteKeyName(){
    return 'slug';
}

答案 3 :(得分:0)

这是因为您从数据库中获取了空数据。

原因是,您在id字段中传递了子弹,所以

localhost/articles/installing-example

您传递的ID =安装示例,因此未找到ID,因此没有数据。

为此 将您的弹转换成原始形式,然后不使用id搜索,而是使用弹子字段进行搜索。

让我们以标题为准。 标题是installing example 所以当你遇到的时候,把它变成原始形式 然后使用原始的赞

进行搜索

$articles = Article::where('titile',$original)->first();