Laravel отношения hasMany массив updateOrCreate - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть User модель, которая имеет отношения hasMany с UserPosition Красноречивая модель:

Модель пользователя

public function positions()
{
    return $this->hasMany(UserPosition::class);
}

Как я могу использовать updateOrCreate метод, когда из запроса приходит array позиций данных?

Код

$positions = [
    "doctor",
    "developer"
];

$user->positions()->each(function($position) use ($positions, $user) {
    $id = $user->id;
    foreach ($positions as $name) {
        $position->updateOrCreate(['user_id' => $id, 'name' => $name], [
            'name' => $name
        ]);
    }
});

Примечание: В этом примере У пользователя нет позиций на таблице базы данных

Но мой код не работает. Почему?

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

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

$positions = collect([
    "doctor",
    "developer"
]);

$positions->each(function($position) use ($user) {
        $user->positions()->updateOrCreate(['name' => $position], [
            'name' => $position
        ]);
    }
});
0 голосов
/ 28 февраля 2020

Это не работает, потому что вы запускаете свой метод updateOrCreate() внутри каждой итерации, которая никогда не запускается, потому что, как вы указали в заметке "этот пример пользователя не имеет никаких позиций в таблице базы данных"

Здесь вы пытаетесь провести l oop через свои в настоящее время существующие позиции, привязанные к вашей модели пользователя:

$user->positions()->each()

Но это не сработает, потому что у пользователя нет позиций в данный момент.

Я предполагаю, что вы пытаетесь обновить позиции пользователя, где возможно, что у пользователя уже есть одна или несколько из этих позиций, связанных с ним, и вы не хотите создавать дубликаты, для этого вы можно сделать это:

$positions = [
    "doctor",
    "developer"
];

foreach($positions as $position) {
    UserPosition::firstOrCreate(['user_id' => $user->id, 'name' => $position]);
}
...