Внешний ключ отношения Laravel Cities

Я действительно новичок в laravel, и я уверен, что делаю что-то не так

У меня 2 стола. Cities И users_metadata

Моя таблица городов выглядит так

id | City        |
1  | New York    |
1  | Los Angeles |

метаданные пользователей

user_id | firt name | last name | cities_id |
1       | Jonh      | Doe       |         2 |

Итак, моя проблема в том, что когда я создаю отношение, я получаю Нью-Йорк, потому что идентификатор города совпадает с идентификатором пользователя.

Модель города

class City extends Eloquent 
{
    public static $table = "cities";

    public function profile()
    {
        return static::has_many('Profile');
    }
}   

профильная модель

class Profile extends Eloquent 
{
    public static $timestamps = false;

    public static $table = "users_metadata";

    public static $key = "user_id";

    public function city()
    {
        return static::has_one('City');
    }
}   

ошибка

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'profile_id' in 'where clause'

SQL: SELECT * FROM `cities` WHERE `profile_id` = ? LIMIT 1

Bindings: array (
  0 => 1,
)

Если я не передам идентификатор, я получаю следующую ошибку

Хорошо, я понимаю это.

Итак, мои вопросы: могу ли я каким-то образом передать внешний ключ cities_id в моем отношении к совпадению? Или я все делаю не так? Может ли кто-нибудь дать мне простой пример?

спасибо, ребята


person Levi    schedule 15.01.2013    source источник
comment
@ w0rldart, пожалуйста, укажите описательную причину ваших правок, если причина не очевидна - и нет необходимости в заголовке «Редактировать».   -  person AD7six    schedule 15.01.2013


Ответы (4)


Попробуй это:

Модель города

class City extends Eloquent 
{
    public static $table = "cities";
    public function profile()
}   

Модель профиля

class Profile extends Eloquent 
{
    public static $timestamps = false;
    public static $table = "users_metadata";
    public static $key = "user_id";
    public function city()
    {
        return static::belongs_to('City');
    }
}

Я столкнулся с той же проблемой, думая, что должен использовать has_one, но мне нужно было использовать own_to. user1808639, вероятно, не сработало, потому что у вас все еще было «has_many» в модели города.

person RLHawk    schedule 16.05.2013

Попробуй это:

class Profile extends Eloquent
{
    public function city()
    {
        return $this->belongs_to('City'); // city_id in the table
    }
}
person user1808639    schedule 16.01.2013

В Laravel есть способ автоматического обнаружения внешних ключей. Итак, для вашей схемы базы данных... эти модели должны работать нормально. Попробуйте следующее.

user_id | firt name | last name |   city_id | //city not cities
1       | Jonh      | Doe       |         2 |

-

class Profile extends Eloquent 
{
    public static $timestamps = false;
    public static $table = "users_metadata";

    public function city()
    {
        return $this->has_one('City');
    }
}

/

class City extends Eloquent 
{
    public static $timestamps = false;

    public function profiles()
    {
        return $this->has_many('Profile');
    }
}
person Alex    schedule 15.01.2013
comment
спасибо за ваш ответ, но он все тот же, я возвращаю SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «profile_id» в «предложении where», и мне все еще нужно передать идентификатор в отношение городов, и по-прежнему соответствует идентификатору с user_id вместо идентификатора с city_id SQL: SELECT * FROM cities WHERE profile_id = ? ПРЕДЕЛ 1 - person Levi; 15.01.2013
comment
Просто небольшое исправление опечатки, profiles() а не profile() как has_many. Разместите свой код, где вы называете модели - person Alex; 15.01.2013
comment
Я настоятельно рекомендую вам прочитать laravel.com/docs/database/eloquent, строки public static $table = "cities"; полностью бесполезно, поскольку Laravel делает это автоматически. У вас есть другая таблица users? если нет, установите users_id в этой таблице на id и опубликуйте контроллер, где вы вызываете модели .... не только модели - person Alex; 15.01.2013

Строки таблицы не должны содержать пробелов. Итак, переименуйте «имя» | "фамилия" в "имя" | "фамилия". SQL-ошибка показывает мне, что вы вызываете модель обратным способом, как City::find(1), в этом случае Laravel ожидает внутри таблицы «Cities» внешний ключ для профилей, который обычно будет «profile_id».

Я думаю, вы ищете что-то вроде этого:

$user_id = 1; 
$user = Profile::find($user_id);

echo $user->firstname." ".$user->lastname." lives in ".$user->city->city;
person Hexodus    schedule 15.02.2013