Laravel 5.8 отношение многие ко многим использует собственные имена столбцов для сводной таблицы - PullRequest
0 голосов
/ 09 мая 2019

У меня есть две таблицы user_details и location, как показано ниже:

user_details
    user_id (INTEGER PRIMARY KEY)
    ......

location
    id (INTEGER UNSIGNED PRIMARY KEY)
    ......

Эти две таблицы связаны между собой многими и могут быть взаимосвязаны.Теперь я использую сводную таблицу location_user_details, как показано ниже

location_user_details
    id (INTEGER UNSIGNED PRIMARY KEY),
    user_id (INTEGER FOREIGN KEY REFERENCES use_details.user_id)
    location_id (INTEGER FOREIGN KEY REFERENCES location.id)
    type (VARCHAR)

Код отношения для модели UserDetails выглядит следующим образом:

class UserDetails extends Model
{
    protected $primaryKey = 'user_id';
    ........
    public function location(){
        return $this->belongsToMany(Location::class, 'location_user_details', 'user_id', 'id')->withPivot('type');
    }
}

Код отношения для модели Location как показано ниже:

class Location extends Model
{
    ......
    public function userDetails(){
        return $this->belongsToMany(UserDetails::class, 'location_user_details', 'id', 'user_id')->withPivot('type');
    }
}

Теперь в моем контроллере я создаю отношение после сохранения объекта UserDetails и Location с помощью следующего кода:

$userDetails->location()->attach($location->id, ['type'=>'HEADQUARTER']);

Когдакод достигает этой строки выполнения, я получаю следующее исключение:

SQLSTATE [HY000]: общая ошибка: 1364 Поле 'location_id' не имеет значения по умолчанию (SQL: вставить в location_user_details (id, type, user_id) значения (1, HEADQUARTER, 0))

Я хочу указать на две вещи, которые происходят.

  1. Поле ввода не попадает в запрос для вставки данных.
  2. Значение user_id равно 0, которое должно быть больше 0, поскольку данные вставляются в user_detailsТаблица.

Теперь позвольте мне упомянуть здесь, что, когда я иду в базу данных, искать данные в location и user_detailsТаблица, я считаю, все данные были вставлены.

Теперь мой вопрос, что возможно пошло не так с этим кодом?

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Ну наконец-то я нашел, что пошло не так.Существует не так много документации по этой теме.На самом деле это лежит с использованием функции belongsToMany.Функция belongsToMany принимает до 7 параметров.До сих пор я мог декодировать первые 4 параметра.

Первый параметр принимает класс связанной модели.

Второй параметр принимает имя сводной таблицы в базе данных.

Третий параметр принимает имястолбец в сводной таблице, который ссылается на модель, для которой вызывается belongsToMany.

Четвертый параметр принимает имя столбца в сводной таблице, который ссылается на связанную модель.

Итакв результате код для функции location в модели UserDetails будет выглядеть так:

public function location(){
    return $this->belongsToMany(Location::class, 'location_user_details', 'user_id', 'location_id')->withPivot('type');
}

А код для функции userDetails в модели Location будет выглядеть так:

public function userDetails(){
    return $this->belongsToMany(UserDetails::class, 'location_user_details', 'location_id', 'user_id')->withPivot('type');
}

Надеюсь, это будет полезно другим.

0 голосов
/ 09 мая 2019

Возможно, проблема в переменной $ location , но она не отображается при ее создании.Убедитесь, что это Местоположение объекта

...