Laravel Eloquent 一对一关系返回空集合

Posted

技术标签:

【中文标题】Laravel Eloquent 一对一关系返回空集合【英文标题】:Laravel Eloquent one-to-one relationship returning empty collection 【发布时间】:2020-09-09 07:08:56 【问题描述】:

我在使用自定义 PK 和 FK 的项目中,我正在尝试建立一对一的关系。

例如在Employee.php中:

public function title()

    return $this->hasOne('App\Title', 'TitleID');

在 Tinker 上,我可以像这样检索员工 TitleID:

$employee = Employee::first();
$employee->TitleID;

返回:

“6”

我现在已经做了一个模型:Title.php:

class Title extends Model

    protected $table = "dbo.title";

    protected $primaryKey = 'TitleID';


在 Tinker 中运行 $title = Title::all(); 时,我可以正确检索此模型的内容。

我在Employee.php中建立了新的关系:

public function title()

    return $this->hasOne('App\Title', 'TitleID');

但是,在 Tinker(我已重新启动)中运行时:

$employee = Employee::first();
$employee->title()->get();

返回:

Illuminate\Database\Eloquent\Collection #3027 全部: [],

我做了什么错误地设置了这种关系?

【问题讨论】:

有相关数据吗? Title::all() 是什么? 您还应该遵循 Laravel 命名约定,这意味着您在 Employee 模型上使用 title_id 而不是 TitleID。如果您遵循命名约定,您的生活会更轻松。 @Qirel 是的,有相关数据。不过,您认为它与命名约定有关是对的!不过,在这种情况下,我正在使用连接到多个应用程序的遗留数据库,并且无法控制它的命名约定:) 【参考方案1】:

问题是因为另一个表的主键不是id,所以它找不到集合。

然而,根据文档,它是这样写的:

此外,Eloquent 假设外键的值应该与父级的 id(或自定义的 $primaryKey)列相匹配。

所以我假设因为我设置了一个自定义 $primaryKey 值,所以它可以直观地找到它 - 但是问题似乎与本地键的名称违反 Eloquent 的约定有关。

我通过分别声明外键和本地键解决了这个问题:

public function title()

    return $this->hasOne('App\Title', 'TitleID', 'TitleID');

【讨论】:

【参考方案2】:

您只需要访问属性title 而不是调用title()

$employee = Employee::first();
$employee->title;

【讨论】:

这不是问题,因为在使用 () 时,您应该仍然能够访问标题,它利用了查询生成器。不过,我已经找到了答案,我已将其发布在下面,您可以查看:) 感谢您抽出宝贵时间查看。

以上是关于Laravel Eloquent 一对一关系返回空集合的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 在 belongsToMany 关系上返回一个空集合

Laravel Eloquent 一对多关系

Laravel Eloquent,添加有限行的关系变为空

laravel eloquent 中的一对多关系

laravel 雄辩的关系一对多返回 null

Laravel5.6 Eloquent ORM 关联关系,一对一和一对多