Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 13.02.2013 01:00:13

Связь many-to-one

Есть типа такие 2 таблицы

class Category extends Eloquent 
{
    public function posts()
    {
        return $this->has_many('Post');
    }
}

class Post extends Eloquent 
{
    public function category()
    {
        return $this->belongs_to('Category');
    }
}

Запись $post = Post::find(1);
А как получить категорию поста я так и не понял
$post->category->title
Выдает Trying to get property of non-object

Не в сети

#2 13.02.2013 09:53:05

Re: Связь many-to-one

category — это метод, а не свойство. Есть статья про отношения с примерами.

Не в сети

#3 13.02.2013 10:42:34

Re: Связь many-to-one

Я это все читал и пробовал, только там отношение has_one
В случае one-to-many

// Тут нормально:
$category = Category::find(1);

// Это работает (магич св-во):
foreach($category->posts as $post)
	echo $post->title . '<br>';

// и это работает
foreach($category->posts()->get() as $post)
	echo $post->title . '<br>';

Делал по аналогии и смотрел ошибку, dd или получаемый запрос (если доходило до запроса)
$post->category->title - не сработало
$post->category()->title - не сработало
$post->category->title - не сработало
$post->category()->first()->title - СРАБОТАЛО
При чем потребовалось явно указать внешний ключ return $this->belongs_to('Category', 'category_id');

В Kohana сработает echo $post->category->title без лишних движений (это можно даже не передавать в шаблон, а сделать там)
Тут получается я выполняю почти обычный запрос и как-то выполнять это в шаблоне $post->category()->first()->title не очень правильно.

Зато в случае с категориями в шаблоне нормально выйдет (нужно передать только $category)

<h1>{{ $category->title }}</h1>
{{ $category->description }}

@foreach ($category->posts as $post)
	<h2>{{ HTML::link_to_route('post', $post->title, array($post->slug)) }}</h2>
	{{ $post->short }}
@endforeach

Изменено amberlex (13.02.2013 10:48:56)

Не в сети

#4 13.02.2013 15:10:40

Ikeaboy
Откуда: Киев
Сообщений: 28

Re: Связь many-to-one

Какой результат PHPvar_dump($post->category);?

Не в сети

#5 13.02.2013 15:17:59

Re: Связь many-to-one

  1. PHP$post->category()->first()->title — СРАБОТАЛО

Конечно сработает, метод category (да, это метод, а не свойство — ты ведь сам определяешь его как PHPfunction category() в классе модели) возвращает объект запроса (Query). Аналогичный объект ты получишь, если сделаешь PHPPost::where('category_id''='1). А раз это Query, то нужно вызвать PHPfirst(), PHPget(), PHPsum() или любой другой метод для получения результата.

Собственно, по ссылке выше пример для PHPhas_one(), а следующий после него — для PHPbelongs_to(). Результат оба дают аналогичный.

Не в сети

#6 13.02.2013 15:29:15

Re: Связь many-to-one

Так в том то и дело, зачем мне такая связь, если проще сделать Category::where('id', '=', $post->category_id)
Весь смысл теряется тогда.
А в таком случае как раз нормально было бы $post->category->title
Э-э-х (

Изменено amberlex (13.02.2013 15:29:54)

Не в сети

#7 13.02.2013 15:37:37

Re: Связь many-to-one

Так просто сделана связь в Eloquent. Если хочется более короткого способа — напиши PHP$this->belongs_to('Category')->first(); и обращайся через PHP$post->category()->title. Две скобки, думаю, не сделают код намного длиннее,

Не в сети

#8 13.02.2013 15:52:57

Re: Связь many-to-one

Да, так лучше будет, но после коханы как-то недоделано или не так изящно кажется все)
Интересно почему не срабатывает "магическое" как для $category->posts
Нужно наверное посмотреть как это работает

Изменено amberlex (13.02.2013 15:53:17)

Не в сети

Подвал раздела