Задать вопрос
@MikhailBond
Студент магистратуры

Каким образом можно изменить стандартный запрос на сохранение к базе в Laravel?

Всем доброго времени суток!
Суть вопроса такова:
Есть таблица в БД, в которой хранятся значения сетевых адаптеров, ввиду этого в таблице не создавалось поле "id" а ключевым полем было назначено поле "mac", поскольку физические адреса сами по себе уникальны.
Для сохранения данных о сетевом адаптере после редактирования я написал следующую функцию:
public function saveNic (Request $request)
    {
        $data = $request->all();
        $host = $data['host'];
        unset ($data['host']);
        $tmp= Networkcard::select(['mac', 'name', 'network', 'wol'])->where('mac',$data['mac'])->get();
        $nic=$tmp[0];
        $nic->fill($data);
        $nic->save();
        return redirect("/host/".$host);
    }

Как видно в коде, проблему с выборкой из базы я обошел следующим образом (если это можно улучшить, подскажите пожалуйста как).
Но при сохранении и вызове метода save() Laravel формирует запрос в котором ключевым полем считает поле id. Ввиду этого резонно говорит мне об ошибке.
cb71f757aa1d4377a6c0c6f33270533b.PNG
Подскажите пожалуйста как можно изменить запрос инструментами Laravel на сохранение данных, или может добавить какие то параметры к методу save(), что бы при запросе не искалось соответствие по полю mac, а не по полю id?
  • Вопрос задан
  • 975 просмотров
Подписаться 1 Оценить 1 комментарий
Решения вопроса 2
riot26
@riot26
<:З )~~
В модель Networkcard добавить:
protected $primaryKey = 'mac';
Ответ написан
Комментировать
DJZT
@DJZT
Laravel - code for you
https://laravel.com/docs/5.4/eloquent

Primary Keys

Eloquent will also assume that each table has a primary key column named id. You may define a $primaryKey property to override this convention.

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
abler98
@abler98
Software Engineer
В модель:
protected $primaryKey = 'mac';
public $incrementing = false;


И как можно так говнокодить на laravel?

Примерно так можно сделать:
Networkcard::where('mac', $request->get('mac'))->update($request->all());
return redirect()->back(); // Думаю это подойдёт

В модели определить $fillable (поля для быстрого обновление)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы