2013-05-14 2 views
6

У меня есть таблица Books: с идентификатором (int) и ISBN (строка) ISBN является уникальным ключом. У меня есть другая таблица, где я храню isbn для книги. На модели книги у меня есть: $ this-> hasMany ('Other', 'isbn', 'isbn');Eloquent: используйте другой столбец в качестве первичного ключа в отношении

Но это игнорирует isbn. Знаете ли вы, как это сделать?

Временное исправление:

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

Короткий ответ - вы не можете. Однако может быть решение. Не могли бы вы объяснить вашу схему? Почему у вас не может быть 'book_id' как ваш fk? –

+0

Это была существующая база данных, и это было довольно плохо (это была не единственная проблема). –

ответ

1

Это невозможно - есть только несколько случаев, когда вы хотели бы связать с уникальным столбцом на столе, который также не рк. Тем не менее, другие структуры разработали методы изменения первичного ключа, и никто еще формально не запрашивал его для Laravel. Вы можете write up a proposal on GitHub, и он может попасть в будущую версию.


Глядя на ваш конкретный пример на мгновение - это может иметь неожиданные результаты, когда вы приходите, чтобы использовать отношения в нетерпеливых погрузочных ситуациях, и на его долю приходится только на одну сторону отношений. Когда вы добавляете applyTo на Other, у вас будет обратная проблема.

Возможно установить связь через isbn; однако это будет иметь форму книги hasOne ISBN, ISBN принадлежит к книге, ISBN hasMany Others, Other принадлежит ISBN; и доступ к свойствам будет выглядеть как $book->isbn->others или $other->isbn->book.

Мое последнее предложение было бы расширить книгу и установить первичный ключ нового класса как isbn и основывать все ваши отношения на этой модели. Это не идеально, но было бы менее болезненно, чем некоторые другие решения.

1

Наткнулся в одной и той же проблемы в последнее время, я не уверен, будет ли это работать, но как идея:

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

Я действительно считаю, что в конце концов вы пропустите метод '-> get(). Я прав ? – frenus

1

Если я читаю это право, вы можете быть в состоянии достичь этого переопределение getKeyName.

public function getKeyName(){ 
     return $yourKeyName; 
    } 
+0

А что, если вам нужны другие отношения в модели? – frenus

+0

Я считаю, что это просто устанавливает нетрадиционное имя для первичного ключа. – adam

0

Поскольку по крайней мере 4.2, теперь вы можете указать локальный ключ в hasMany.

Из документации (4.2, 5.2):

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

 Смежные вопросы

  • Нет связанных вопросов^_^