我有一个表书籍:带有ID(int)和ISBN(字符串)ISBN是唯一的密钥。我有另一张桌子,我把书中的isbn存储起来。 在书模型上我有: $ this-> hasMany('Other','isbn','isbn');
但这忽略了伊斯本。你知道这样做的方法吗?
临时修复:
$this->primaryKey = 'isbn';
return $this->hasMany('Other', 'isbn');
答案 0 :(得分:2)
最近遇到了同样的问题,我还不确定这是否有效,但是作为一个想法:
class Book {
public function isbn() {
// instead of hasMany
return ISBN::where('isbn', $this->isbn);
}
}
答案 1 :(得分:2)
由于至少4.2,您现在可以在hasMany
中指定本地密钥。
return $this->hasMany('Comment', 'foreign_key', 'local_key');
答案 2 :(得分:1)
这是不可能的 - 只有少数几个实例要链接到不是pk的表上的唯一列。也就是说,其他框架已经开发出了更改主键的方法,但还没有人正式为Laravel请求它。您可以write up a proposal on GitHub,它可能会在未来版本中发布。
暂时查看您的具体示例 - 当您在急切的加载情况下使用该关系时,这可能会产生意外结果,并且它只会考虑关系的一方。当你在别人身上添加belongsTo时,你会遇到相反的问题。
有可能通过isbn建立关系;然而,这将采取Book hasOne ISBN,ISBN belongsTo Book,ISBN hasMany Others,Other belongsTo ISBN;访问属性看起来像$book->isbn->others
或$other->isbn->book
。
我的最后一个建议是扩展Book,并将新类的主键设置为isbn
,并将所有关系建立在该模型上。这并不理想,但其他一些解决方案会不那么痛苦。
答案 3 :(得分:1)
如果我正确地阅读此内容,您可以通过覆盖getKeyName来实现此目的。
public function getKeyName(){
return $yourKeyName;
}