part_os
@part_os
Сложное в простом

Как передать из формы в модель null?

Всем привет, подскажите правильную реализацию передачи параметров из формы в контроллер из контроллера в модель и записать в базу. Возникла проблема по полю firm_id, при записи в базу значение получается строкой 'null' а не значением NULL и выдает ошибку:
SQLSTATE[HY000]: General error: 1366 Incorrect integer value: 'null' for column 'firm_id' at row 1 
(SQL: update `tdauction` set `status` = 0, `firm_id` = null where `idauction` = 4025)

В базе firm_id тип int по умолчанию null, null разрешен.
Как правильно сделать связку контроллер модель?
<tr>
        <td>Выигравшая фирма</td>
        <td>
            <select class="form-control" name="firm_id"  id="firm_id" >
                @foreach($firms as $firm)
                <option @if($auction->firm_id == $firm->id) {{'selected'}} @endif  
                                    value="{{$firm->id}}" >{{$firm->name}}</option>
                @endforeach
                    <option @if( is_null($auction->firm_id)) {{'selected'}} @endif  value="null" ></option>
            </select>
        </td>
</tr>

Контроллер:
public function postEditWinAuction(Request $request){
        if (isset($_POST['idauction'])) {
            $idauction = $_POST['idauction'];
        } else {
            return null;
        }
        $value =
            [
                'idauction' => $idauction,
                'protokol'  => $_POST['protokol'],
                'kontrakt'  => $_POST['kontrakt'],
                'firm_id'   => $_POST['firm_id'],
                'status'    => $_POST['status']
            ];
        return $id = \App\Auction::editWinAuction($value);
    }

Модель:
public static function editWinAuction($value){
        if(is_null($value['idauction'])){
            return null;
        }
        else{
            $auction = self::find($value['idauction']);
        }
//Сделал пока так что бы не выходила ошибка
if ($value['firm_id']== 'null'){
	$firm_id = null;
}
else{
	$firm_id = $value['firm_id'];
}
        $auction->protokol = $value['protokol'];
        $auction->kontrakt = $value['kontrakt'];
        $auction->firm_id = $firm_id;
        $auction->status = $value['status'];
        $auction->save();
        $id_name = $auction->primaryKey;
        return $id = $auction->$id_name;
    }
  • Вопрос задан
  • 428 просмотров
Решения вопроса 1
@Yan-s
Это норм, можно покомпактнее
$auction->firm_id = $value['firm_id'] === 'null' ? null : $value['firm_id'];


UPD
Нафига вы $_POST юзаете? В контроллер $request передается и никак не используется. И где валидация? Зачем делаете перед retrurn присвоение $id?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
pLavrenov
@pLavrenov
Разработка сайтов
1) лучше использовать Request - документация https://laravel.ru/docs/v5/requests
2) Нужно добавить валидацию - https://laravel.ru/docs/v5/validation
3) В отличии от предыдущего комментатора скажу что это совсем не норм.

Код в контроллере заменить на этот:
public function postEditWinAuction(Request $request){
        $this->validate($request, [
            'idauction' => 'required|integer', // Если должен быть обязательным
            // Тут условия для остальных полей
        ]);

        $values = $request->only([
            'protokol',
            'kontrakt',
            'firm_id',
            'status',
        ]);

        return Auction::find($request->idauction)->update($values);
    }


Чтобы работал Model::update() в модели нужно разрешить поля для массового заполнения
class Auction extends Model
{
    protected $fillable = [
        'protokol',
        'kontrakt',
        'firm_id',
        'status',
    ];
}


Удалить ту часть которая находится в Модели. Там не должны производится сохранения и хранится прочие функции для этого можно использовать трейты.

Для всех полей которые могут быть null в миграции надо добавить ->nullable()
Schema::create('auctions', function($table)
{
  $table->increments('id');
  $table->string('firm_id')->nullable();
});

Тогда тот вариант который написал я будет правильно отрабатывать даже если firm_id не приходит в данных.

Вообще рекомендую прочитать документацию целиком. Тогда будет представление какие плюшки есть в Laravel "из коробки".
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы