机锋:在关系使用另一列作为主键

问题描述 投票:7回答:4

我有一个表的书:有ID(int)和一个ISBN(string)的ISBN是一个独特的密钥。我在那里我存储的书籍中的ISBN另一个表。在这本书的模型我有函数:$ this->的hasMany( '其他', '国际标准书号', 'ISBN');

但是,忽略了书号。你知不知道这样做的方法吗?

临时的解决办法:

$this->primaryKey = 'isbn';
return $this->hasMany('Other', 'isbn');
laravel laravel-4 eloquent
4个回答
1
投票

这是不可能的 - 只有少数情况下,你想链接到一个独特的列在表上,是不是也该峰。这就是说,其他框架已经制定改变主键的方法,也没有人已正式要求它Laravel呢。您可以write up a proposal on GitHub,它可能会使它在给未来的版本。


看你的了一会儿具体的例子 - 这可能有意想不到的结局,当你来到使用预先加载的情况下的关系,它只占关系的一个侧面。当您在其他加入属于关联你就会有相反的问题。

有可能设置通过ISBN的关系;然而这将需要预订hasOne书号,书号属于关联图书,书号的hasMany其他人,其他属于关联ISBN的形式;和访问性能会是什么样子$book->isbn->others$other->isbn->book

我最后的建议是延长图书,并设置新类的主键isbn和基础上,该模型所有关系。它的效果并不理想,但它是痛苦少其他的一些解决方案。


2
投票

迷迷糊糊了同样的问题最近,我还没有确定这是否会工作,但作为一个理念:

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

2
投票

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

从文档(4.25.2,5.4,5.7):

return $this->hasMany('Comment', 'foreign_key', 'local_key');

1
投票

如果我读这个权利,你可以通过覆盖getKeyName实现这一目标。

    public function getKeyName(){
        return $yourKeyName;
    }
© www.soinside.com 2019 - 2024. All rights reserved.