Вывод данных страницы из бд Laravel
Люди добрые, подскажите пожалуйста. Не могу разобраться как в Laravel вытянуть из БД данные страницы(Тайтл, описание и тд). Передаю значение url в контроллер:
Route::get('/page/{url}', 'PageController@page')->where('url', '[a-z]+');
В контроллере пытаюсь получить все необходимые данные страницы:
<?php
namespace App\Http\Controllers;
use App\Category;
use App\Page;
use Illuminate\Http\Request;
class PageController extends Controller
{
protected $category;
protected $page;
public function __construct()
{
// Коллекция всех категорий
$this->category = Category::all();
// Коллекция всех страниц
$this->page = Page::all();
}
public function page($url) {
$page = $this->page->find($url);
$title = $page->title;
echo $title;
return view('page', ['catalog' => $catalog, 'page_show' => $page_show, 'page' => $page, 'title' => $title]);
}
}
Модель:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Page extends Model
{
protected $table = 'pages';
}
Поля таблицы: id|url|title|description|created_at|updated_at Trying to get property 'title' of non-object - получаю на выходе...
Не могу найти примеры, возможно плохо ищу, очень буду благодарен за дельный совет.
Ответы (2 шт):
В строке this->page->find($url) вы пытаетесь получить запись по $url. Но, в документации сказано, что метод Eloquent Collection find делает выборку по primary key.
The find method finds a model that has a given primary key
Вам стоит попробовать изменить primary key через protected $primaryKey = 'url'; в модели или получить конкретную запись через Page::where('url', $url)->get().
Я был в той же ситуации в моём проекте! Всё просто: Доступ к постам, страницам и их данным в Ларавел происходит не по url, а через БД и id. url нельзя передать в адрес (иначе получится винегрет, url в квадрате).
В вашем случае нужно передавать id, которое предварительно нужно присвоить в ссылке к странице. Вот так в showpage.blade.php:
@foreach ($page as $pages)
<a href="{{ route('page.show', ['page' => $pages->id]) }}">ссылка</a>
@endforeach
а роут, который будет принимать id вот такой:
Route::get('/page/{page}', 'PageController@page')->name('page.show');
И тогда контроллер такой:
namespace App\Http\Controllers;
use App\Page;
use Illuminate\Http\Request;
class PageController extends Controller
{
public function page($id){
$page = Page::find($id);
$title = $page->title;
$description = $page->description;
return view('page', ['title' => $title, 'description' => $description]);
}
}