У меня 3 таблицы
user: id, username subreddits: id, name, created_at posts: id, title, link, user_id, subreddit_id
Проблема в том, что я извлекаю идентификатор subreddit / category вручную, в то время как мне нужно получать его динамически. Как я могу это достичь?
Это метод show()
в SubredditController.php
public function show(Subreddit $subreddit) { $posts = Subreddit::findOrFail(3)->posts()->get(); return view('subreddit/show')->with('subreddit', $subreddit) ->with('posts', $posts); }
И это Subreddit Model
class Subreddit extends Model { protected $fillable = [ 'name', 'description' ]; public function user() { return $this->belongsTo('App\User'); } public function posts() { return $this->hasMany('App\Post'); } }
routes.php
Route::resource('subreddit', 'SubredditController'); Route::resource('posts', 'PostsController');
RouteServiceProvider.php
$router->model('articles', 'App\Article'); $router->model('subreddit', 'App\Subreddit'); $router->model('posts', 'App\Post');
Когда вы используете привязку модели маршрута, Laravel автоматически извлекает объект для $ id, предоставленного в URI, который затем может быть введен в ваш метод в качестве аргумента с использованием инъекции зависимостей.
public function show(Subreddit $subreddit){ ... }
Вы можете получить доступ к данным, как к любому объекту. Например, для доступа к идентификатору записи вы можете использовать $subreddit->id
.
public function show(Subreddit $subreddit) { $posts = Subreddit::findOrFail($subreddit->id)->posts()->get(); return view('subreddit/show')->with('subreddit', $subreddit) ->with('posts', $posts); }
Я довольно новичок в Laravel, но думаю, вам нужно определить маршрут с параметрами (извините, если я неправильно понял ваш вопрос).
Вам необходимо передать идентификатор, используя ваш маршрут.
В файле routes.php вы можете получить следующее:
Route::get('subreddit/{id}', 'SubredditController@show');
И в SubredditController.php передайте id вашему методу, например:
public function show($id) { $subreddit = Subreddit::findOrFail($id); $posts = $subreddit->posts()->get(); return view('subreddit/show')->with('subreddit', $subreddit) ->with('posts', $posts); }
Почему вы вводите модель в параметр функции?
show(Subreddit $subreddit)
Я видел это где-то, но я не могу вспомнить о необходимости использовать его.
вы используете автоинкремент id
столбца в базе данных ?, Если нет, вы должны указать его в модели, добавляющей свойство incrementing и устанавливая его в false
public $incrementing = false;
и укажите фактический ключ
protected $primaryKey = 'code';
С конфигурацией, которую вы опубликовали, этот код работает для меня:
routes.php
Route::resource('subreddit', 'SubredditController');
SubredditController.php
public function show($id) { $subreddit = Subreddit::findOrFail($id); $subreddit->load('posts'); return view("subreddit/show")->with("subreddit", $subreddit); }
URL
http://localhost:8888/test/public/subreddit/1
Я загружаю отношение в одном и том же объекте, поэтому отправляю только один параметр в представление
Я думаю, что вы хотите здесь привязать модель маршрута
Если вы используете laravel 5, у него есть отличный учебник для этого здесь.
здесь также имеется документация для привязки маршрутной модели.
Хорошая новость – это модель маршрута. Связывание также гибкое, даже привязка сложного подмножества данных от вашей модели к маршруту. который, я думаю, подойдет вам.
Категория Fetch со всеми сообщениями
$categories = Subreddit::with('posts') -> where('id',$id) -> first(); if (categories){ $data['results'] = categories; }else{ $data['results'] = null; } return view('myview') -> with($data);
Переменные $results
будут доступны в вашем представлении. На ваш взгляд
if (!is_null($results){ foreach($results as $result){ // do something. } }
Помогите эту помощь.