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 一对一关系返回空集合的主要内容,如果未能解决你的问题,请参考以下文章