Eloquent:使用另一列作为关系的主键

时间:2013-05-14 19:23:45

标签: laravel laravel-4 eloquent

我有一个表书籍:带有ID(int)和ISBN(字符串)ISBN是唯一的密钥。我有另一张桌子,我把书中的isbn存储起来。 在书模型上我有: $ this-> hasMany('Other','isbn','isbn');

但这忽略了伊斯本。你知道这样做的方法吗?

临时修复:

$this->primaryKey = 'isbn';
return $this->hasMany('Other', 'isbn');

4 个答案:

答案 0 :(得分:2)

最近遇到了同样的问题,我还不确定这是否有效,但是作为一个想法:

class Book {
    public function isbn() {
        // instead of hasMany
        return ISBN::where('isbn', $this->isbn);
    }
}

答案 1 :(得分:2)

由于至少4.2,您现在可以在hasMany中指定本地密钥。

从文档(4.25.2,5.4,5.7):

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;
    }