3
votes

Laravel récupère le slug de la base de données

J'essaye de créer un blog comme une application avec la dernière version de laravel. J'essaie de comprendre comment extraire un slug de la base de données pour chaque article, puis l'acheminer pour que tout fonctionne correctement.

Cela fonctionne en quelque sorte, mais le contenu ne s'affichera pas sur l'article si vous utilisez le slug pour l'afficher.

localhost / articles / 1 - fonctionne bien, le contenu s'affiche sur la page (titre, etc.)

localhost / articles / Installing-example - cela fonctionne mais les erreurs de contenu

Cela se produit lorsque vous essayez d'accéder à la page en utilisant le slug de la base de données: Essayer d'obtenir la propriété 'title' d'un non-objet (View: C: \ xampp \ htdocs \ blogtest \ resources \ views \ articles \ show.blade.php)

Erreur avec cette ligne:

php echo e ($ articles-> title); ?>

app / http / controllers / ArticlesController:

@extends('layouts.master')

@section('content')

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

@endsection

app / Article.php

XXX

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

ressources \ vues \ articles \ show.blade.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    protected $table = 'articles';
    public $primaryKey = 'id';
    public $timestamps = true;
}


0 commentaires

4 Réponses :


2
votes

Vous devez définir la clé de route dans votre modèle

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


0 commentaires

1
votes

Essayez ceci

​​ Sans slug

Route

@extends('layouts.master')

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

/ article / {id}

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

Blade p>

Route::get('/articles/{slug}', ['as'=>'articles.by.slug', 'uses'=> 'ArticlesController@showArticles']);
or
Route::get('/articles/{slug}', 'ArticlesController@showArticles')->name('articles.by.slug');

Avec Slug

Route

@extends('layouts.master')

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

/ article / {slug}

Contrôleur

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

Blade

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


0 commentaires

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

0 commentaires

0
votes

C'est parce que vous obtenez des données nulles de la base de données.

La raison est que vous passez le slug dans le champ id donc

localhost/articles/installing-example

vous passez id = install-example, donc aucun identifiant n'est trouvé donc aucune donnée que vous obtenez.

donc pour ça convertissez votre boue en une forme originale et recherchez sans identifiant, recherchez avec votre champ de slug.

laissez supposer du titre que vous faites slug. title est un exemple d'installation alors quand vous obtenez une limace, faites-en une forme originale puis recherchez avec l'original comme

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


0 commentaires