【问题标题】:Laravel Eloquent non-object errorLaravel Eloquent 非对象错误
【发布时间】:2014-09-12 01:55:17
【问题描述】:

我正在尝试通过将一个用 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);
}
}

模型用户.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');
}

}

在我的视图 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 }}}

我收到以下错误: 错误异常 (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    |                |
+---------+-------------------------------+------+-----+---------+----------------+

我在语法上尝试了各种各样的变化,但我现在只是在踩水。 感谢收看!

【问题讨论】:

  • 你的意思是{{{ $user-&gt;ip()-&gt;ip_addr }}}
  • @fakemeta 这不是问题,Eloquent 将这些关系转换为模型对象的属性。 @Tom 我相信您的用户关系中存在大写错误,您与 IP 相关,但课程是 Ip
  • 将 () 添加到 ip 会返回以下错误:ErrorException (E_UNKNOWN) Undefined property: Illuminate\Database\Eloquent\Relations\HasOne::$ip_addr
  • @watcher OOps 确实做到了,这是使用 Ip 而不是 IP 或 ip 进行测试的残余。我已经纠正了它,但问题仍然存在。我也会在这里调整它。谢谢!
  • 问题是不是每个用户都有相关的ip,所以你在foreach循环中从$user-&gt;ip得到null。您需要在访问其属性之前检查关系是否存在。

标签: php laravel-4 eloquent


【解决方案1】:

在您的用户模型中,您定义了这种关系:

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

您试图将UserIP 类相关联,但您没有IP 类,您有一个Ip 类。该关系可能无法加载并导致您的错误。

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

Eloquent 通过指定以下约定来处理这些关系: 数据库表名应该是模型名称的小写复数版本(模型用户自动使用数据库表用户)。所有主键都假定为id,外键是小写模型名称的单数版本,其后附加_id (user_id)。如果你遵循这个约定,那么你可以只用一个参数来声明你的关系:

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

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

更新

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

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

看看这是否能解决你的问题。

【讨论】:

  • 我将该字段更改为 user_id 以符合约定并节省一些输入!我仍然遇到这个问题。在这一点上,我想知道我是否在更深层次上误解了这一点。我的表“用户”没有参考表“ips”的字段。 'ips' 有一个外键,将字段 'user_id' 链接到 'users' 表的 'id' 字段。
  • 我想知道用户实例本身是否真的有任何与之关联的 Ip 条目?您能否使用 usersips 表的数据库架构更新您的问题?
  • 让我失望的是,如果我这样做:{{{ $user->ip }}} 我会从“ips”表中得到正确行的响应。它给我的印象是我在正确的轨道上,但我可能错了。
  • 您的用户表中有ip 的列吗?如果是这样,那么 eloquent 正在获取 that 而不是 ips 中的关联条目
  • 我在 users 表中没有 ip 列。我目前正在查找发布数据库模式的格式,以便将其添加到问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2014-12-28
  • 2014-04-08
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 2015-08-14
相关资源
最近更新 更多