Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 01.12.2020 00:29:10

Почему не сохраняется в таблицу первая строка из массива в Laravel?

Здравствуйте.
Столкнулся с необьяснимым. Не хочет сохраняться в таблице первая строка двумерного массива.
Код самый простой. Перебираю в цикле массив и обновляю записи в базе.
Из двумерного массива беруться значения. Первый элемент в массиве 0, так ?
При начале цикла с нуля апдейтяться все записи кроме первой строки.
При начале цикла с 1 тоже самое, апдейтяться все записи кроме первой строки.
При начале цикла с 2, записи обновляются с начиная с третьей строки.
Не могу же я сделать переменную " $i " отрицательной ?
"Это какой то ... фиаско.

for ($i=1; $i<count($csvarr); $i=$i+1)
  {                            
       if (isset($csvarr[$i][0]))   { $NUMBER  =  $csvarr[$i][0]; } else {$NUMBER = " ";}
        if (isset($csvarr[$i][1]))   { $NUMBER2 =  $csvarr[$i][1]; } else {$NUMBER2 = " ";}
        if (isset($csvarr[$i][2]))   { $WEIGHT =  $csvarr[$i][2]; } else { $WEIGHT = " ";}
        if (isset($csvarr[$i][3]))   { $VPE =  $csvarr[$i][3]; } else {$VPE = " ";}
        if (isset($csvarr[$i][4]))   { $VIN =  $csvarr[$i][4]; } else {$VIN = " ";}
        if (isset($csvarr[$i][5]))   { $NL =  $csvarr[$i][5]; } else { $NL = " ";}
        if (isset($csvarr[$i][6]))   { $TITLE =  $csvarr[$i][6]; } else { $TITLE = " ";}
        if (isset($csvarr[$i][7]))   { $TEILEART =  $csvarr[$i][7]; } else { $TEILEART = " ";}

$record = vagprice::where('NUMBER', $NUMBER)->update(['NUMBER2' => $NUMBER2, 'WEIGHT' => $WEIGHT, 'VPE' => $VPE, 'VIN' => $VIN, 'NL' => $NL, 'TITLE' => $TITLE, 'TEILEART' => $TEILEART]);

                               // $i++;
                            }

Не в сети

#2 01.12.2020 07:25:22

Re: Почему не сохраняется в таблицу первая строка из массива в Laravel?

Первый элемент в массиве 0, так ?

Обычно так. Поэтому условие цикла должно быть

for ($i = 0; $i <= count($csvarr); $i++)

или лучше

foreach ($csvarr as $i => $item)

потому что в PHP массивы могут быть всякими

вот эти некрасивые строки

if (isset($csvarr[$i][0]))   { $NUMBER  =  $csvarr[$i][0]; } else {$NUMBER = " ";}
. . .
...->update(['NUMBER2' => $NUMBER2, ...])

можно заменить на

...->update([
  'NUMBER' => $csvarr[$i][0] ?? " ",
  . . .
]);

Изменено artoodetoo (01.12.2020 07:39:58)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 01.12.2020 11:02:10

Re: Почему не сохраняется в таблицу первая строка из массива в Laravel?

Я уже не знаю.
Пробовал и foreach и for при $i=0  $i=1.
Вроде не в этом дело. Массив я дамплю и проверяю, первый элемент $csvarr в порядке, и подходит для записи в базу.
Все последующие строки нормально записываются.
Все строки абсолютно одинаковые, вот они в csv:

496354;865;455;0;15;9;zestankel;propilen
1093804;231;12;8;42;5;buwezlen;dectil
735161;9879;89;6;37;6;drezina;railway
7475450;9789;87;5;92;6;ceramin;pmixture
8615;5235;35;2;41;4;notice;error
4451925;4363;76;4;80;6;knowledge;moonlight
275;643643;23;9;70;8;raiser;Sunday
20124;64364;97;1;60;5;blaiser;mushroom
780;6443;23;1;54;5;Fafaru;mubaki
9818;745865;55;2;75;6;dorequ;nodoku
4977;967;78;7;74;7;pokrywka;nato
4;23532;33;3;23;8;tpmas;qwemdo
45696745;48565;55;5;49;9;weclomen;rytiol

Извините за простыню, но я уже  вручную индекс, без цикла:

$NUMBER  =  $csvarr[2][0];
$NUMBER2 =  $csvarr[2][1];
$WEIGHT =  $csvarr[2][2];
$VPE =  $csvarr[2][3];
$VIN =  $csvarr[2][4];
$NL =  $csvarr[2][5];
$TITLE =  $csvarr[2][6];
$TEILEART =  $csvarr[2][7];
              
$record = vagprice::where('NUMBER', $NUMBER)->update(['NUMBER2' => $NUMBER2, 'WEIGHT' => $WEIGHT, 'VPE' => $VPE, 'VIN' => $VIN, 'NL' => $NL, 'TITLE' => $TITLE, 'TEILEART' => $TEILEART]);
  dd($record);   // результат 1

$NUMBER  =  $csvarr[1][0];
$NUMBER2 =  $csvarr[1][1];
$WEIGHT =  $csvarr[1][2];
$VPE =  $csvarr[1][3];
$VIN =  $csvarr[1][4];
$NL =  $csvarr[1][5];
$TITLE =  $csvarr[1][6];
$TEILEART =  $csvarr[1][7];
              
$record = vagprice::where('NUMBER', $NUMBER)->update(['NUMBER2' => $NUMBER2, 'WEIGHT' => $WEIGHT, 'VPE' => $VPE, 'VIN' => $VIN, 'NL' => $NL, 'TITLE' => $TITLE, 'TEILEART' => $TEILEART]);
  dd($record);   // результат 1

$NUMBER  =  $csvarr[0][0];
$NUMBER2 =  $csvarr[0][1];
$WEIGHT =  $csvarr[0][2];
$VPE =  $csvarr[0][3];
$VIN =  $csvarr[0][4];
$NL =  $csvarr[0][5];
$TITLE =  $csvarr[0][6];
$TEILEART =  $csvarr[0][7];
              
$record = vagprice::where('NUMBER', $NUMBER)->update(['NUMBER2' => $NUMBER2, 'WEIGHT' => $WEIGHT, 'VPE' => $VPE, 'VIN' => $VIN, 'NL' => $NL, 'TITLE' => $TITLE, 'TEILEART' => $TEILEART]);
  dd($record);   // результат 0

То есть первая строка из массива ни в какую не хочет вставляться.
496354;865;455;0;15;9;zestankel;propilen  , Если менять строки местами в csv  файле, то все равно первая не вставляется.
Это какая то фантастика, но наяву.

Не в сети

#4 01.12.2020 11:11:33

Re: Почему не сохраняется в таблицу первая строка из массива в Laravel?

Update не вставляет, а изменяет существующую запись. Если её нет, значит нет smile


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#5 01.12.2020 11:12:37

Re: Почему не сохраняется в таблицу первая строка из массива в Laravel?

Почему бы тебе не почитать документацию вместо проб на удачу!


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#6 01.12.2020 11:17:21

Re: Почему не сохраняется в таблицу первая строка из массива в Laravel?

Да есть же.
У меня две функции в контроллере, одна апдейтит одиночную запись, вторая списком из csv.
Первая функия апдейтит все записи включая первую, вторая функция списком, все кроме первой.
Убиться об стену.

Не в сети

#7 01.12.2020 11:20:11

Re: Почему не сохраняется в таблицу первая строка из массива в Laravel?

ИМХО, мы говорим на разных языках. Типа кто-то путает запись и поле, вставку и обновление. В документацию!


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#8 01.12.2020 11:25:47

Re: Почему не сохраняется в таблицу первая строка из массива в Laravel?

Сидел всю ночь над этим, могу и перепутать.  Спасибо за участие.

Не в сети

#9 01.12.2020 13:13:06

Re: Почему не сохраняется в таблицу первая строка из массива в Laravel?

Кстати, твой dd($record); должен показывать сколько строк обновлено, если не ошибаюсь.

0 может означать как то что условие where не позволило ничего обновить (записи нет), так и случай, когда новые значения полей  совпали со значеними в существующей записи — фактически ничего не обновлено.

"То есть первая строка из массива ни в какую не хочет вставляться." — не вставляться, а обновляться, т.к. здесь update, а не insert.

Изменено artoodetoo (01.12.2020 13:16:10)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#10 01.12.2020 13:33:30

Re: Почему не сохраняется в таблицу первая строка из массива в Laravel?

Кстати сам подумал, что может не заходит запись,
И получил при

$NUMBER = $csvarr[0][0] ;                     // $NUMBER = 496354    есть значение из csv
vagprice::where('NUMBER', $NUMBER)->get()     // НЕ находит    $records = 0

vagprice::where('NUMBER','496354')->get()     //  Находит    $records = 1

$NUMBER = (string) $NUMBER;
vagprice::where('NUMBER', $NUMBER)->get()     // опять НЕ находит

Поле NUMBER в базе текстовое.
Тоже самое с методом Update, наверное.
Может я не так пише этот запрос
where('NUMBER', $NUMBER)

Изменено alonewalker (01.12.2020 13:34:06)

Не в сети

Подвал раздела