Я только что начал работу с laravel v3 и пытаюсь обернуть голову вокруг отношений «один-ко-многим», создавая блог, у меня есть сообщения, которые имеют отношение «много к одному» с категориями (каждая почта связана с категорией).
У меня есть следующие таблицы со следующими полями:
Сообщения : id, title, body, date_created, category_id
Категории : id, name
У меня есть следующие две модели:
class Category extends Eloquent { public function posts() { return $this->has_many('Post'); } } class Post extends Eloquent { public function categories() { return $this->belongs_to('Category'); } }
Я понял, как получить все сообщения, перейдя в категорию id:
category::find(2)->posts()->get())
Мне просто нужна помощь в выяснении, как получить все сообщения, и получить их соответствующие категории. Поэтому в конце дня в представлении я могу вывести что-то вроде этого:
{$post->title} - Category: {$post->category->name}
Спасибо за любую помощь!
Надеюсь, вы найдете эти советы полезными.
На пост-модели переименуйте функцию category
в category
. Отношение belongs_to
является единственным, поэтому этот пост имеет одну и только одну категорию.
Отношения также имеют короткую руку, этот сокращенный синтаксис полезен, потому что он чище использовать и результаты кэшируются. Вот пример:
$category = Category::find(1); foreach($category->posts as post) { echo $post->title; }
Теперь пример того, как получить все сообщения со связанными с ними категориями:
$posts = Post::all(); foreach($posts as $post) { echo $post->category->name; }
Теперь одна вещь, которую вы быстро заметите, делая этот второй пример, – это количество запросов, увеличивающихся для каждого вашего сообщения. Это называется эффектом N + 1. Например, если у вас есть 5 сообщений, один запрос будет выполнен для получения этих сообщений. Затем в цикле мы выполняем запрос, чтобы получить категорию. Результатом этого является 6 запросов.
Чтобы решить эту проблему, используйте загружаемую загрузку, которая уменьшает эти 6 запросов в нашем примере до 2.
$posts = Post::with('category')->all(); foreach($posts as $post) { echo $post->category->name; }
Надеюсь, это поможет!
Laravel 4 имеет немного отличающийся синтаксис, он использует camelCase для создания выражений (в то время как L3 использует синтаксис snake_Case). Новый синтаксис Laravel (L4) теперь совместим с PSR-1 .
L3 : $this->belongs_to('Category'); L4 : $this->belongsTo('Category');
Чтобы доказать, что «нетерпевая загрузка» повышает производительность вашего приложения (минимизируя запросы к базе данных), используйте экосистему событий Laravel.
// app/routes.php Event::listen('illuminate.query', function($sql) { echo '<h4>' . $sql . '</h4>' ;});
,