2014-09-11 6 views
1

Я пытаюсь ознакомиться с Laravel и структурой MVC, перенеся приложение, написанное на php, в Laravel.Laravel Eloquent non-object error

Я создал контроллер UserController.php:

<?php 

class UserController extends BaseController{ 
public function showUsers(){ 
    // Display all SQL executed in Eloquent 
    Event::listen('illuminate.query', function($query) 
    { 
    var_dump($query); 
    }); 
    $users = User::all(); 
    return View::make('users')->with('users', $users); 
} 
} 

Модель User.php:

<?php 

class User extends Eloquent { 

protected $table = 'users'; 

public $timestamps = false; 

public function ip() 
{ 
    return $this->hasOne('IP', 'user'); 
} 

} 

и модель IP.php

<?php 

class IP extends Eloquent { 

protected $table = 'ips'; 

public $timestamps = false; 

public function user() 
{ 
    return $this->belongsTo('User'); 
} 

} 

В моих пользователей просмотреть .blade.php Я показываю информацию о выборе для всех пользователей в формате таблицы, например:

<tbody> 
    @foreach($users as $user) 
    <tr> 
     <td>{{ $user->id }}</td> 
     <td>{{{ $user->lname . ',' . $user->fname }}}</td> 
     <td>{{{ $user->ip }}}</td>      
    </tr> 
    @endforeach 
</tbody> 

При выполнении, как это я получаю ответ массива для IP-адреса, таких как:

{"id":"257","ip_addr":"167772675","network":"2","user":"00002","router":null,"used":"1"} 

которая является правильной информацией для отображения для этой строки пользователя. Если я пытаюсь получить только нужный адрес ИС:

{{{ $user->ip->ip_addr }}} 

Я получаю следующее сообщение об ошибке: ErrorException (E_UNKNOWN) Попытка получить свойство необъектных

Схема базы данных выглядит следующим образом : пользователи стола:

+---------+-------------------------------+------+-----+---------+----------------+ 
| Field | Type       | Null | Key | Default | Extra   | 
+---------+-------------------------------+------+-----+---------+----------------+ 
| id  | smallint(5) unsigned zerofill | NO | PRI | NULL | auto_increment | 
| fname | varchar(30)     | NO |  | NULL |    | 
| lname | varchar(30)     | NO |  | NULL |    | 
| bname | varchar(40)     | NO |  | NULL |    | 
| addr1 | varchar(50)     | NO |  | NULL |    | 
| addr2 | varchar(50)     | NO |  | NULL |    | 
| city | varchar(50)     | NO |  | NULL |    | 
| state | varchar(2)     | NO |  | NULL |    | 
| zip  | varchar(5)     | NO |  | NULL |    | 
| email | varchar(254)     | NO |  | NULL |    | 
| phone1 | varchar(12)     | NO |  | NULL |    | 
| phone2 | varchar(12)     | NO |  | NULL |    | 
| idate | date       | YES |  | NULL |    | 
| tdate | date       | YES |  | NULL |    | 
| ptype | int(11)      | YES |  | NULL |    | 
| maddr | varchar(12)     | NO |  | NULL |    | 
| antenna | int(11)      | YES | MUL | NULL |    | 
| notes | text       | NO |  | NULL |    | 
| service | int(11)      | YES | MUL | NULL |    | 
| company | int(11)      | NO |  | 0  |    | 
| active | tinyint(1)     | NO |  | 1  |    | 
| blocked | tinyint(1)     | NO |  | 0  |    | 
+---------+-------------------------------+------+-----+---------+----------------+ 

и настольный ИПС:

+---------+-------------------------------+------+-----+---------+----------------+ 
| Field | Type       | Null | Key | Default | Extra   | 
+---------+-------------------------------+------+-----+---------+----------------+ 
| id  | int(11)      | NO | PRI | NULL | auto_increment | 
| ip_addr | int(10) unsigned    | NO | UNI | NULL |    | 
| network | int(11)      | YES | MUL | NULL |    | 
| user_id | smallint(5) unsigned zerofill | YES | MUL | NULL |    | 
| router | int(11)      | YES | MUL | NULL |    | 
| used | tinyint(1)     | NO |  | NULL |    | 
+---------+-------------------------------+------+-----+---------+----------------+ 

Я пробовал широкий спектр вариантов синтаксиса, и я просто наступаю на эту воду. Спасибо, что посмотрели!

+0

Вы имели в виду '{{{$ user-> ip() -> ip_addr}}}'? – fakemeta

+0

@fakemeta, что не будет проблемой, Eloquent превращает эти отношения в свойства объектов модели. @Tom Я считаю, что у вас есть ошибка capitilization в ваших отношениях с пользователем, вы связаны с «IP», но класс «Ip» –

+0

. Добавление() в ip возвращает вместо этого ошибку: ErrorException (E_UNKNOWN) Неопределенное свойство : Illuminate \ Database \ Eloquent \ Relations \ HasOne :: $ ip_addr –

ответ

1

В модели пользователя вы определяете эту связь:

public function ip() 
{ 
    return $this->hasOne('IP', 'user'); 
} 

Вы пытаетесь связать User с IP класса, но вы не имеете IP класса, у вас есть Ip класса. Отношения, вероятно, не загружаются и вызывают ошибку.

Кроме того, согласно documentation, вторым параметром метода hasOne является внешний ключ, который должен использоваться при связывании записей в базе данных друг с другом. В этом случае это должен быть внешний ключ внутри таблицы users, который указывает на записи в таблице ips. Я не думаю, что вы хотите использовать user в качестве параметра.

Eloquent работает с этими отношениями, указывая следующее соглашение: имена таблиц базы данных должны быть в нижней части версии имени модели (модель User автоматически использует пользователей таблицы базы данных). Предполагается, что все первичные ключи id, а внешние ключи - это единственная версия имен моделей с нижним обсазом с добавлением к ним _id (user_id).Если вы будете следовать этому соглашению, то вы можете объявить свои отношения только с одним параметром:

public function ip() 
{ 
    return $this->hasOne('Ip'); 
} 

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

Update

По вашей схеме, вы не имеете hasOne отношения, но у вас есть hasMany отношения. Если это был hasOne, в таблице пользователя будет указана ip_id (указывающая отношение «один к одному»). Поскольку у одного пользователя может быть много IP-адресов, обновите это отношение:

return $this->hasMany('Ip'); 

И посмотрите, не устраняет ли это проблему.

+0

Я сменил поле на user_id, чтобы он соответствовал соглашениям и сэкономил себе некоторую типизацию! Тем не менее, я все еще испытываю эту проблему. Я удивляюсь, если я буду недопонимать это на более глубоком уровне. У моих «пользователей» таблицы нет поля для ссылки на таблицу «ips». «ips» имеет внешний ключ, который связывает поле «user_id» с полем «id» таблицы «users». –

+0

Интересно, имеет ли сам экземпляр пользователя какие-либо записи Ip, связанные с ним? Не могли бы вы обновить свой вопрос с помощью схемы базы данных таблиц 'users' и' ips'? –

+0

Часть, которая меня бросает, заключается в том, что если я просто делаю: {{{$ user-> ip}}} Я получаю ответ с правильной строкой из таблицы «ips». Это дает мне впечатление, что я нахожусь на правильном пути, но, возможно, я ошибаюсь. –