7

我有一个表 Books: 带有一个 ID (int) 和一个 ISBN (string) ISBN 是一个唯一键。我有另一张桌子,用来存放这本书的 isbn。在图书模型上,我有: $this->hasMany('Other', 'isbn', 'isbn');

但这忽略了isbn。你知道这样做的任何方法吗?

临时修复:

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

4 回答 4

3

Since at least 4.2, you can now specify the local key in the hasMany.

From the documentation (4.2, 5.2, 5.4, 5.7) :

return $this->hasMany('Comment', 'foreign_key', 'local_key');
于 2016-02-10T15:16:42.507 回答
2

最近偶然发现了同样的问题,我还不确定这是否可行,但作为一个想法:

class Book {
    public function isbn() {
        // instead of hasMany
        return ISBN::where('isbn', $this->isbn);
    }
}
于 2013-07-02T11:29:02.083 回答
1

这是不可能的 - 只有少数情况下您希望链接到表上的唯一列,该列也不是 pk。也就是说,其他框架已经开发了更改主键的方法,还没有人正式要求 Laravel 使用它。你可以在 GitHub 上写一个提案,它可能会在未来的版本中出现。


看一下您的具体示例 - 当您在急切加载情况下使用关系时,这可能会产生意想不到的结果,并且它只占关系的一方面。当您在 Other 上添加 belongsTo 时,您将遇到相反的问题。

或许可以通过isbn建立关系;然而,这将采用 Book hasOne ISBN,ISBN belongsTo Book,ISBN hasMany Others,Other belongsTo ISBN 的形式;并且访问属性看起来像$book->isbn->othersor $other->isbn->book

我的最后一个建议是扩展 Book,并将新类的主键设置为isbn并将所有关系都基于该模型。这并不理想,但与其他一些解决方案相比,它会不那么痛苦。

于 2013-05-15T08:18:36.010 回答
1

If I'm reading this right, you may be able to achieve this by overriding getKeyName.

    public function getKeyName(){
        return $yourKeyName;
    }
于 2013-09-19T22:10:43.620 回答