Проверка поля данных базы данных перед вставкой данных - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть данные, поступающие со страницы HTML.И я хочу проверить, существует ли уже дата и стоимость места.Если они существуют, он должен выдать ошибку о том, что Данные уже присутствуют, если эти данные о дате и месте отсутствуют, это должно позволить пользователю сохранить их.

Вот код, который я написал, чтобы сохранить его,

public function StoreSampling(Request $request)
{
  $date = Carbon::createFromFormat('d-m-Y', $request->input('date'))->format('Y-m-d');

  $doctorname = Input::get('doctorselected');
  $product = Input::get('product');
  $product= implode(',', $product);
  $quantity = Input::get('qty');
  $quantity =implode(',',$quantity);
  $representativeid = Input::get('representativeid');
  //Store all the parameters.
  $samplingOrder = new   SamplingOrder();
  $samplingOrder->date = $date;
  $samplingOrder->doctorselected = $doctorname;
  $samplingOrder->products = $product;
  $samplingOrder->quantity = $quantity;
  $samplingOrder->representativeid = $representativeid;
  $samplingOrder->save();
  return redirect()->back()->with('success',true);
}

Я искал некоторые из Stack поверх потоковых страниц.И наткнулся на обнаружение существования по идентификатору И вот пример,

$count = DB::table('teammembersall')
    ->where('TeamId', $teamNameSelectBoxInTeamMembers)
    ->where('UserId', $userNameSelectBoxInTeamMembers)
    ->count();

if ($count > 0){
    // This user already in a team
    //send error message
} else {
    DB::table('teammembersall')->insert($data);
}

Но я хочу сравнить дату и место.И если их нет, я хочу позволить пользователю сохранить его.В основном пытается остановить дубликаты записей.

Пожалуйста, помогите мне с этим.

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Для этого есть очень хорошие вспомогательные функции, называемые firstOrNew и firstOrCreate, последние будут создавать их напрямую, а первая вам понадобится явно вызвать save.Поэтому я бы пошел со следующим:

$order = SamplingOrder::firstOrNew([
  'date' => $date,
  'place' => $place 
], [
   'doctorname'       => Input::get('doctorselected'),
   'product'          => implode(',', Input::get('product')),
   'quantity'         => implode(',',Input::get('qty')),
   'representativeid' => Input::get('representativeid')
]);

if($order->exists()) {
   // throw error
   return;
}

$order->save();
// success
0 голосов
/ 21 ноября 2018

Лучший способ - использовать уникальную проверку laravel для нескольких столбцов.Взгляните на это .Я предполагаю, что id - ваш первичный ключ и в таблице sampling_orders.Правило проверки выглядит следующим образом:

'date' => ['unique:sampling_orders,date,'.$date.',NULL,id,place,'.$place]

ps: я не вижу никаких place входных данных в вашем StoreSampling()

0 голосов
/ 21 ноября 2018

Вам нужно изменить запрос следующим образом:

$userAlreadyInTeam = SamplingOrder::where('date', $date)
    ->where('place', $place) // I'm not sure what the attribute name is for this as not mentioned in question
    // any other conditions
    ->exists();

if (userAlreadyInTeam) {
    // Handle error
} else {
    // Create
}

Вам не нужно использовать count() в качестве единственной попытки определить существование.

Также рассмотрите возможность добавленияатрибут multi column unique для вашей базы данных, чтобы гарантировать, что у вас нет члена с такими же данными и местом.

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