Laravel, добавить существующую сущность в коллекцию сущностей - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь добавить существующую сущность в коллекцию сущностей, например

$entity->collection->push(Entity::where('field', 'value')->first());
[...]
// When I log $entity I see the new entity in $entity->collection
$entity->save();
// But nothing on database

У вас есть подсказка, почему она не сохраняет сущность?

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Вы упомянули BelongsToMany, это важная информация.

Подробнее об управлении отношениями «многие ко многим» можно прочитать в Laravel Документах .

Но вкратце вы хотите использовать ->attach($entity).

Итак, ваш код должен быть:

$entity->collection()->attach(
    Entity::where('field', 'value')->first()->getKey()
);

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

0 голосов
/ 23 января 2020

Дело HasMany

Предполагается, что $entity является экземпляром Eloquent, а collection является магическим c свойством, представляющим отношение hasMany, поэтому у вас есть что-то вроде:

class Entity extends Model 
{
//...
    public function collection()
    {
        return $this->hasMany(Entity:class);
    }
//...
}

, тогда collection - это только короткий путь для доступа к $entity->collection()->get(), поэтому его нельзя использовать для изменения БД.

Вместо этого вы можете вызвать

$entity->collection()->save(
    Entity::where('field', 'value')->first()
);

в соответствии с https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Relations/HasMany.html#method_save

BelongsToMany

Отношение «многие ко многим» имеет метод attach, который принимает ключ связанной записи в качестве первого аргумента :

$entity->collection()->save(
    //assume relation is built by primary key
    Entity::where('field', 'value')->first()->getKey()
);

Полная документация здесь - https://laravel.com/docs/6.x/eloquent-relationships

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...