Laravel eloquent – Отношения для многих

Я только что начал работу с 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>' ;}); 

,