【问题标题】:Can't get to work Laravel models with many relationships无法使用具有许多关系的 Laravel 模型
【发布时间】:2015-01-15 16:22:07
【问题描述】:

我有 2 个关系非常复杂的表。表users 有两个表images 的外键,表images 有一个表users 的外键,它与其他两个外键无关。

我无法制作正确的模型。我需要让所有引用的字段都与模型相关联,并且User 中有images 属性,它返回该用户拥有的所有图像。
这是我的表格生成代码:

Schema::create('users', function ($table) {
  $table->increments('id')->unsigned();

  $table->integer('portrait')->unsigned()->nullable();
  $table->integer('backimg')->unsigned()->nullable();

  $table->timestamps();
});
Schema::create('images', function ($table) {
  $table->increments('id')->unsigned();

  $table->integer('owner')->unsigned();
  $table->foreign('owner')->references('id')->on('users');

  $table->timestamps();
});
Schema::table('users', function($table) {
  $table->foreign('portrait')->references('id')->on('images');
  $table->foreign('backimg')->references('id')->on('images');
});

这是我对模型的尝试:

class User extends Eloquent implements UserInterface, RemindableInterface {
    public function backimg(){
        return $this->hasOne('Image', 'backimg');
    }
    public function portrait(){
        return $this->hasOne('Image', 'portrait');
    }
    public function images(){
        return $this->belongsTo('Image', 'owner');
    }
}
class Image extends Eloquent {
    public function owner(){
        return $this->hasOne('User', 'owner');
    }
}

我认为上面的代码应该可以工作,但是所有属性都返回字符串而不是对象。

【问题讨论】:

  • 旁注:->nullable()->default(null) 是多余的,你不需要那里的默认值。
  • @TimLewis 我知道,我写它是为了以后很容易改成其他东西。

标签: php laravel eloquent


【解决方案1】:

您不能将关系命名为与外键列的名称相同!

更改任何一个都可以,但是我建议您将外键列更改为owner_idportrait_id 等...然后您也不需要在关系中指定外键列,因为您是使用常规名称。

【讨论】:

  • 那些不是外键名——它们是列名。 Laravel 自动命名外键,在前面加上表名。
  • 对不起,我实际上是指你的外键列的名称
  • 无论如何,我不明白将字段从 portrait 重命名为 portrait_id 会有什么帮助。可以举个例子吗?
  • 问题是它们与关系属性发生冲突。因此,当您执行 $user->portrait 时,您将获得外键列的值,因为 Laravel 将首先检查非关系属性。明白我的意思吗?
猜你喜欢
  • 2021-05-13
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 2016-08-25
  • 1970-01-01
  • 2014-01-11
相关资源
最近更新 更多