我有一个表 Books: 带有一个 ID (int) 和一个 ISBN (string) ISBN 是一个唯一键。我有另一张桌子,用来存放这本书的 isbn。在图书模型上,我有: $this->hasMany('Other', 'isbn', 'isbn');
但这忽略了isbn。你知道这样做的任何方法吗?
临时修复:
$this->primaryKey = 'isbn';
return $this->hasMany('Other', 'isbn');
最近偶然发现了同样的问题,我还不确定这是否可行,但作为一个想法:
class Book {
public function isbn() {
// instead of hasMany
return ISBN::where('isbn', $this->isbn);
}
}
这是不可能的 - 只有少数情况下您希望链接到表上的唯一列,该列也不是 pk。也就是说,其他框架已经开发了更改主键的方法,还没有人正式要求 Laravel 使用它。你可以在 GitHub 上写一个提案,它可能会在未来的版本中出现。
看一下您的具体示例 - 当您在急切加载情况下使用关系时,这可能会产生意想不到的结果,并且它只占关系的一方面。当您在 Other 上添加 belongsTo 时,您将遇到相反的问题。
或许可以通过isbn建立关系;然而,这将采用 Book hasOne ISBN,ISBN belongsTo Book,ISBN hasMany Others,Other belongsTo ISBN 的形式;并且访问属性看起来像$book->isbn->others
or $other->isbn->book
。
我的最后一个建议是扩展 Book,并将新类的主键设置为isbn
并将所有关系都基于该模型。这并不理想,但与其他一些解决方案相比,它会不那么痛苦。
If I'm reading this right, you may be able to achieve this by overriding getKeyName.
public function getKeyName(){
return $yourKeyName;
}