【发布时间】:2018-05-19 16:08:31
【问题描述】:
这是我创建数据库的方式(每个员工可以有多个头衔):
CREATE TABLE employees (
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender ENUM ('M','F') NOT NULL,
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no)
);
CREATE TABLE titles (
emp_no INT NOT NULL,
title VARCHAR(50) NOT NULL,
from_date DATE NOT NULL,
to_date DATE,
FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE,
PRIMARY KEY (emp_no,title, from_date)
);
这些是相应的模型:
class employee extends Model
{
protected $primaryKey = 'emp_no';
public $incrementing = false;
protected $connection = 'testMYSQL';
public function title()
{
return $this->hasMany('App\title', 'emp_no');
}
}
class title extends Model
{
protected $primaryKey = ['emp_no', 'title', 'from_date'];
public $incrementing = false;
protected $connection = 'testMYSQL';
public $timestamps = false;
public function employee()
{
return $this->belongsTo('App\employee', 'emp_no');
}
}
在我的控制器中,我使用了这样创建的模型:
return $employee = employee::find(1)->title;
但是我在上面的行中得到了这个错误:
"试图获取非对象的属性'title'"
更新:这些工作正常:
return $employee = employee::first()->title;
return $employee = title::first()->employee;
我认为关系是正确的,问题是 Laravel 仍然没有注意到主键是 emp_no 而不是 id。我将 $primaryKey 类型从 protected 更改为 public,但仍然出现同样的错误。
【问题讨论】:
-
没有
id1 的员工,所以你在null 上调用->title。 -
你有
emp_no ==1的记录 -
这里的“id”是“emp_no”,不是吗?我的记录中存在 'emp_no' = 1 的员工
-
是的,我在上面的评论中犯了错误。虽然这不能解决您当前的问题,但 eloquent 模型不支持复合主键,因此标题模型无法按照您当前设置的方式工作。
-
我认为错误与模型有关。是否正确定义了关系?
标签: php laravel eloquent relational-database one-to-many