Как условно переопределить значение в модели Eloquent? - PullRequest
2 голосов
/ 27 июня 2019

Я делаю:

Model::with('animal')->get()->each(function (&$item) {
    if (condition($item)) {
        $item->animal = 'Yop Override';
    }
})->toArray();

Но я не могу переопределить animal.Есть ли способ сделать это?

Моя уродливая альтернатива:

array_map(function($item) {
    if (condition($item)) {
        $item['animal'] = 'Yop Override';
    }
    return $item;
}, Model::with('animal')->get()->toArray());

Ответы [ 2 ]

4 голосов
/ 27 июня 2019

Причина, по которой он не работает, заключается в том, что вы пытаетесь переписать отношение модели, которое вы не можете сделать простым присваиванием.

Вы можете достичь того, что хотите, с помощью метода setRelation:

Model::with('animal')
    ->get()
    ->each(function ($item) {
        if (true) {
            $item->setRelation('animal', 'Yop override');
        }
    })
    ->toArray();

Если вы хотите использовать метод map, это будет то же самое, но вам придется добавить возврат в конце функции.

Model::with('animal')
    ->get()
    ->map(function ($item) {
        if (true) {
            $item->setRelation('animal', 'Yop override');
        }

        return $item;
    })
    ->toArray();
0 голосов
/ 27 июня 2019

В вашем примере вы используете ->each(), вы должны использовать ->map() и возвращать $item.

Во-вторых, вам нужно $key/$value внутри function().

В-третьих, используйте use при передаче других данных.

Model::with('animal')->get()->map(function ($model, $key) use (&$item) {
    if (condition($item)) {
        $item->animal = 'Yop Override';
    }
    return $item;
})->toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...