我试图通过将用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 | |
+---------+-------------------------------+------+-----+---------+----------------+
我在语法上尝试了各种各样的变化,而我此刻只是在踩水。 谢谢你的期待!
答案 0 :(得分:1)
在您的用户模型中,您可以定义此关系:
public function ip()
{
return $this->hasOne('IP', 'user');
}
您尝试将User
与IP
班级相关联,但是您没有IP
班级,而是有Ip
班级。这种关系可能无法加载并导致您的错误。
此外,根据documentation,hasOne
方法的第二个参数是Eloquent在将数据库中的条目相互关联时应使用的外键。在这种情况下,它应该是users
表中指向ips
表中记录的外键。我认为你不想在那里使用user
作为参数。
Eloquent通过指定以下约定来处理这些关系:数据库表名称应该是模型名称的小写复数版本(模型用户自动使用数据库表用户)。假设所有主键都是id
,外键是低级别模型名称的单数形式,并附加_id
(user_id
)。如果您遵循此约定,那么您可以使用一个参数声明您的关系:
public function ip()
{
return $this->hasOne('Ip');
}
你绝对可以忽略这些约定,并且有一些方法可以在代码中覆盖它们,尽管遵守这些约定更加有意义,而不必担心所有这些额外的参数。
<强>更新强>
根据您的架构,您没有hasOne
关系,但您有hasMany
关系。如果它是hasOne
,则用户表中会有ip_id
(表示一对一的关系)。由于单个用户可以拥有多个IP,因此请将此关系更新为:
return $this->hasMany('Ip');
看看是否能解决您的问题。