2013-11-13 3 views
0

Я использую Eloquent, чтобы вытащить пользователей из моей базы данных, и я хочу «присоединиться» к почтовому индексу из таблицы моих пользователей с почтовым индексом из таблицы моих городов, для извлечения имени города.Laravel with() метод, передать другой столбец, чем первичный

Heres упрощенная версия моих таблиц:

users => 
    id 
    username 
    password 
    postal_code 

cities => 
    postal_code 
    city_name 

В моей модели пользователя у меня есть метод, называемый город(), объявляющие отношения с моим городом таблицей:

public function city() { 
    return $this->hasOne('cities', 'postal_code'); 
} 

сейчас проблема когда я пытаюсь выполнить User :: with ('city') -> find ($ user_id), значение, переданное методу, является первичным ключом, а id вместо почтового_кода.

Так что мой запрос заканчивает тем, что (это для пользователя с идентификатором 1):

select * from `cities` where `cities`.`postal_code` in ('1') 

Есть ли каким-то образом указать, что я хочу передать POSTAL_CODE вместо этого?

ответ

1

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

public function city() 
{ 
    return $this->belongsTo('City', 'postal_code'); 
} 

Пользователь принадлежит только одному городу, но город имеет много пользователей. В модели города у вас будет.

public function users() 
{ 
    return $this->hasMany('User', 'postal_code'); 
} 

Теперь у вас все еще есть проблемы, потому что Laravel ожидает, что отношения будут использовать первичный ключ модели. Чтобы получить эту работу, вам нужно будет сделать почтовый индекс первичным ключом для модели City.

class City extends Eloquent { 

    protected $primaryKey = 'postal_code'; 

} 

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

$city = City::find($postal_code); 

Ненавижу бросать ключ в свой план здесь, но во многих местах город будет иметь много почтовых индексов. :)

+0

Спасибо, что сработало! Это немного запутывает переход от присоединения вручную к использованию ORM, поэтому догадайтесь, что я их перепутал. – jah

+0

И о городах, имеющих одинаковые почтовые индексы, я только что присвоил имя одному и тому же, так что это не проблема (; Onlt несколько городов здесь, в Дании, в любом случае. Первичный ключ здесь уже был почтовым кодом, поэтому это просто отлично – jah

1

Поскольку класс Relation использует parent->getKey() (родитель является пользователем на вашем случае), это приведет к «1».

Я не думаю, что изменение ключа для пользователя на postal_code является хорошим вариантом;) Так что я предполагаю, что таблица пользователей столбец «city_id» и города «id», поэтому все может работать как разработан.

Другой бы не вернуть отношения, но что-то вроде .. return City::wherePostalCode($this->postal_code)->first();

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