Laravel Получить слизняк из базы данных - PullRequest
3 голосов
/ 25 марта 2019

Я пытаюсь создать приложение, похожее на блог, с последней версией laravel.Я пытаюсь выяснить, как вытащить слаг из базы данных для каждой статьи, а затем направить его на все работает правильно.

У меня это работает, но контент не будет отображаться в статье, если вы используете его для просмотра.

localhost / articles / 1 - работает нормально, содержимое отображается на странице (заголовок и т. Д.)

localhost / articles / installation-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;
}

routs / 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 \ article \ show.blade.php

@extends('layouts.master')

@section('content')

    <h1>{{$articles->title}}</h1>

@endsection

база данных https://i.imgur.com/uNyrZw8.png

Любая помощь и предложения будут оценены спасибо.

Ответы [ 4 ]

3 голосов
/ 25 марта 2019
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 голос
/ 25 марта 2019

Попробуйте это

Без пули

Маршрут

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');
* +1034 * / статьи / {пробкового} * * одна тысяча тридцать пять

Контроллер

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
1 голос
/ 25 марта 2019

Вам нужно установить ключ маршрута в вашей модели

// Article model
public function getRouteKeyName(){
    return 'slug';
}
0 голосов
/ 25 марта 2019

Это потому, что вы получаете нулевые данные из базы данных.

Причина в том, что вы передаете slug в поле id, поэтому

localhost/articles/installing-example

вы передаете id = установка-Пример, следовательно, идентификатор не найден, поэтому никаких данных вы не получите.

, поэтому для этого преобразуйте ваш slud в исходную форму и ищите не по id, выполните поиск по полю slug.

название, которое вы делаете слизень.название - installing example, поэтому, когда вы получите слаг, превратите его в оригинальную форму, а затем выполните поиск с оригиналом, например

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

...