Laravel Eloquent非对象错误

时间:2014-09-11 16:01:14

标签: php laravel-4 eloquent

我试图通过将用PHP编写的应用程序迁移到Laravel来熟悉Laravel和MVC结构。

我已经设置了一个控制器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);
}
}

Model User.php:

<?php

class User extends Eloquent {

protected $table = 'users';

public $timestamps = false;

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

}

和Model IP.php

<?php

class IP extends Eloquent {

protected $table = 'ips';

public $timestamps = false;

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

}

在我看来users.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"}

对于为该行显示的用户,这是正确的信息。 如果我试图通过以下方式获得所需的IP地址:

{{{ $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       |                |
+---------+-------------------------------+------+-----+---------+----------------+

和表格ips:

+---------+-------------------------------+------+-----+---------+----------------+
| 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    |                |
+---------+-------------------------------+------+-----+---------+----------------+

我在语法上尝试了各种各样的变化,而我此刻只是在踩水。 谢谢你的期待!

1 个答案:

答案 0 :(得分:1)

在您的用户模型中,您可以定义此关系:

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

您尝试将UserIP班级相关联,但是您没有IP班级,而是有Ip班级。这种关系可能无法加载并导致您的错误。

此外,根据documentationhasOne方法的第二个参数是Eloquent在将数据库中的条目相互关联时应使用的外键。在这种情况下,它应该是users表中指向ips表中记录的外键。我认为你不想在那里使用user作为参数。

Eloquent通过指定以下约定来处理这些关系:数据库表名称应该是模型名称的小写复数版本(模型用户自动使用数据库表用户)。假设所有主键都是id,外键是低级别模型名称的单数形式,并附加_iduser_id)。如果您遵循此约定,那么您可以使用一个参数声明您的关系:

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

你绝对可以忽略这些约定,并且有一些方法可以在代码中覆盖它们,尽管遵守这些约定更加有意义,而不必担心所有这些额外的参数。

<强>更新

根据您的架构,您没有hasOne关系,但您有hasMany关系。如果它是hasOne,则用户表中会有ip_id(表示一对一的关系)。由于单个用户可以拥有多个IP,因此请将此关系更新为:

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

看看是否能解决您的问题。