【问题标题】:laravel eloquent relationship getting property on non-objectlaravel 雄辩的关系在非对象上获取属性
【发布时间】: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,但仍然出现同样的错误。

【问题讨论】:

  • 没有id 1 的员工,所以你在null 上调用->title
  • 你有emp_no ==1的记录
  • 这里的“id”是“emp_no”,不是吗?我的记录中存在 'emp_no' = 1 的员工
  • 是的,我在上面的评论中犯了错误。虽然这不能解决您当前的问题,但 eloquent 模型不支持复合主键,因此标题模型无法按照您当前设置的方式工作。
  • 我认为错误与模型有关。是否正确定义了关系?

标签: php laravel eloquent relational-database one-to-many


【解决方案1】:

是的,我认为 find 方法的错误,因为直到我知道 find() 方法只适用于 Id(主键)

你的桌子有emp_no所以,

employee::find(1)->title;

此方法无效,出现以下错误

"Trying to get property 'title' of non-object"

【讨论】:

  • 但是我已经保护了 $primaryKey = 'emp_no';在我的模型中。
  • 你可以试试这个 $emp = employee::where('emp_no',1)->first(); $emp->标题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2019-07-16
  • 1970-01-01
  • 2015-03-14
  • 2018-11-28
相关资源
最近更新 更多