Отношения Laravel - hasMany, hasOne - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть две модели, модель заказа и модель адреса. Каждая строка в таблице заказов имеет идентификатор адреса, который соответствует строке в таблице адресов.

в порядке модели ...

public function address()
{
    return $this->hasOne(OrderAddress::class);
}

в адресной модели ...

public function order()
    {
        return $this->hasMany(Order::class);
    }

Однако я хочу получить доступ к адресу из модели заказа

$order->address

Это показывает ошибку, потому что у меня нет полей order_id в таблице адресов. В конце концов я хочу, чтобы можно было проверить, существует ли уже адрес в таблице (т. Е. Для повторных заказов от одного и того же клиента), и затем я могу повторно использовать эту же строку в нескольких заказах.

Таким образом, в итоге, заказ может иметь только 1 адрес, но адрес может иметь много заказов. Я настроил свои модели так (думаю), но выдается следующая ошибка:

Column not found: 1054 Unknown column 'order_addresses.order_id' in 'where clause'

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

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

public function order()
    {
        return $this->hasMany('App\Order', 'foreign_key', 'local_key');
    }

public function address()
{
    return $this->hasOne('App\OrderAddress', 'foreign_key');
}

Laravel предполагает, что вы используете лучшие практики именования баз данных, где:

  • Таблицы = имя_таблицы
  • сводные таблицы = tablea_tableb
  • первичные ключи = id
  • внешний ключ = referencedtable_id

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

Подробнее о красноречивых отношениях здесь .

0 голосов
/ 27 апреля 2018

Это довольно распространенная путаница, но обратное значение hasMany равно belongsTo.

Что вам нужно:

public function address()
{
    return $this->belongsTo(OrderAddress::class);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...