Laravel по-русски

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

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

#1 16.10.2012 23:13:22

Зависимости в Eloquent

Есть необходимость использовать ORM для облегчения взаимодействия с базой данных. Сущности связаны между собой следующими зависимостями:
- Gate один ко многим Device;
- Device один ко многим Canal;

Для для реализации этих зависимостей в моделях были установлены соответствующие взаимосвязи(Relationships).

Модель шлюзы:

class Gate extends Eloquent
    {
        public static $timestamps = false;
        
        public function system(){
            return $this->belongs_to('System');
        }
        
        
        public function gatetype(){
            return $this->belongs_to('Gatetype');
        }
     
        public function device(){
            return $this->has_many('Device');
        }
       
    }

Модель устройства:

class Device extends Eloquent
    { 
       public static $table = 'devices';
       public static $timestamps = false;
        
       public function gate(){
            return $this->belongs_to('Gate');
       }
       
       public function gatetype(){
            return $this->belongs_to('Devtype');
       }
       
       public function canal(){
            return $this->has_many('Canal');
       }
      
    }

Модель каналы:

class Canal extends Eloquent
    {
        public static $timestamps = false;

        public function canaltype(){
            return $this->belongs_to('Canaltype');
        }
        
        public function condition(){
            return $this->has_many('Condition');
        }
        
        public function scnstep(){
            return $this->has_many('Scnstep');
        }
        
        public function device(){
            return $this->belongs_to('Device');
        }
        
    }

При данных взаимоотношениях работают конструкции вида:

   Gate::find($id)->device()->get();

Но при использовании конструкций вида:

   Gate::find($id)->device()->canal()->get();

Я получаю ошибку:

Call to a member function device() on a non-object

Документация, увы, мне не помогла.
Возможно, я неправильно установил взаимоотношения, либо я не правильно понимаю механизм построения запросов.
В чем кроется проблема?

Не в сети

#2 17.10.2012 08:21:59

Re: Зависимости в Eloquent

У тебя один и тот же код выдаёт ошибку при одинаковых же значениях PHP$id? Что показывает просто PHPvar_dump(Gate::find($id))?

PHPfind() возвращает null когда не может найти объект по ID. Во втором случае у тебя просто нет записи в БД с ID = PHP$id.

Не в сети

#3 17.10.2012 10:52:26

Re: Зависимости в Eloquent

Боюсь я не правильно выразился, прошу прощения за невнимательность, вот это работает:

   Gate::find($id)->device()->get();

Так же как и

   Gate::find($id)

$id по которому производится поиск корректно, а такая запись в базе данных существует.
Проблема заключается в выражениях:

   Gate::find($id)->device()->canal()->get();

Ошибка следующего содержания:

	Method [canal] is not defined on the Query class.

Не в сети

#4 17.10.2012 15:33:23

Re: Зависимости в Eloquent

Всё верно, метод отношения возвращает не модель, а запрос, поэтому нужно вызвать один из конечных методов (first(), get(), count() и т.д.), например:

PHP
Gate::find($id)->device()->first()->canal()->get();

Не в сети

#5 18.10.2012 11:52:21

Re: Зависимости в Eloquent

Да действительно, вы правы. Мне это в голову увы не пришло. Спасибо за помощь.

Не в сети

#6 18.10.2012 13:16:03

Re: Зависимости в Eloquent

Отношения полезны не только для выборки, но и для обновления/создания записей. Например, можно сделать так:

PHP
Gate::find($id)->device()->insert('device_field'123);

Eloquent автоматически добавит к записи gate_id, который был передан в PHPfind().

Не в сети

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