BG Development


  Reply to this topicStart new topicStart Poll

> Laravel - Зареждане на данни от БД
miss
Публикувано на: 28-12-2018, 15:40
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 31
Регистриран на: 14.04.15



Здравейте,
Имам форма за добавяне на записи в базата данни. Едно от полетата в тази форма е:
CODE

файл create.blade.php
<select name="field" id="field" class="select-input">
  <option value="">Not specified</option>
  <option value="1">Yes</option>
  <option value="0">No</option>
</select>


При добавяне на записа, ако не бъде избрана опция Yes или No (т.е. остане избрано "Not specified"), се записва null в съответното поле на базата данни.

Проблемът ми е обаче, когато искам да редактирам този запис:
CODE

файл edit.blade.php
<select name="field" id="field" class="select-input">
  <option value="" КАК ДА НАПРАВЯ ПРОВЕРКАТА ТУК ДАЛИ Е NULL И АКО Е NULL ДА МИ ЗАРЕДИ "Not Specified" ВЪВ ФОРМАТА ЗА РЕДАКТИРАНЕ>Not specified</option>
  <option value="1" {{old('field', $phone->field) == 1 ? 'selected' : ''}}>Yes</option>
  <option value="0" {{old('field', $phone->field) == 0 ? 'selected' : ''}}>No</option>
</select>


С този код прочитам каква стойност е записана в базата данни за това поле, за да мога да заредя информацията в полето във формата за редактиране. Проблемът е, че информацията се зарежда коректно само ако са избрани опции "Yes" или "No", ако е била записана стойност null в базата данни ми се зарежда "No", а аз искам да ми зареди "Not specified".

Функцията в класа:
CODE

public function getFieldFormattedAttribute()
   {
       $field = ($this->field == 'No' || $this->field == 'Yes' ? 'No' : 'Yes');

       return $field;
   }
PMEmail Poster
Top
escapeboy
Публикувано на: 28-12-2018, 17:17
Quote Post



Име: Никола Кацаров
Група: Потребител
Ранг: Редовен член

Мнения: 425
Регистриран на: 04.12.04



Зарежда ти "No" защото
0 == ''
0 == null
0 == false
и т.н.
CODE

 <option value="0" {{old('field', $phone->field) === 0 ? 'selected' : ''}}>No</option>

Ще работи, защото ще селектне по подразбиране първия option.
CODE

<option value="" @if(is_null(old('field', $phone-field)) selected @endif)>Not specified</option>

Виж обаче дали при '' полето наистина е null или е '' в базата. Ако е '' използвай empty(), но най-добре още при запис да си го сетваш на null.

Бих ти препоръчал да си го кастнеш това поле като boolean на ниво модел. Ще имаш true, false и null.

И ако полето наистина се казва field (не само за примера) по-добре му сложи по-описателно име.


--------------------
PMEmail PosterUsers Website
Top
miss
Публикувано на: 28-12-2018, 17:40
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 31
Регистриран на: 14.04.15



QUOTE (escapeboy @ 28-12-2018, 17:17)
Зарежда ти "No" защото
0 == ''
0 == null
0 == false
и т.н.
CODE

 <option value="0" {{old('field', $phone->field) === 0 ? 'selected' : ''}}>No</option>

Ще работи, защото ще селектне по подразбиране първия option.
CODE

<option value="" @if(is_null(old('field', $phone-field)) selected @endif)>Not specified</option>

Виж обаче дали при '' полето наистина е null или е '' в базата. Ако е '' използвай empty(), но най-добре още при запис да си го сетваш на null.

Бих ти препоръчал да си го кастнеш това поле като boolean на ниво модел. Ще имаш true, false и null.

И ако полето наистина се казва field (не само за примера) по-добре му сложи по-описателно име.

Полето в базата данни е null по подразбиране, ако не бъде избрано Yes/No при въвеждане. Ясно ми е защо ми зарежда "No", но не мога да направя проверката за да не го зарежда.
PMEmail Poster
Top
7bH5ypIdk9Ij
  Публикувано на: 12-01-2019, 08:37
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 21
Регистриран на: 25.11.18



С NULL

Aко МНОГО искаш да е *null* Полето
проверката ти трябва да е с === а не с ==
това се опитваха да обяснят колегите в предните постове

(Причината, ако те интересува де, е че == сравнява стойности, както хората ги възприемаме.. проверката

null == false // е true - защото компютъра сравнява дали е "истинно" или "неистинно", с по "меки граници" - на английски са "truthy" & "falsy" values.
Ако ползваш == се приема че неща като Null или 0 или "" са "нищо" и затова са "false"


проверката null === false // е false - защото компютъра сравнява "педантично" стойностите)

От това следва формата да е (би трябвало да работи, не съм тествал)
CODE

<select name="field" id="field" class="select-input">
 <option value="" {{old('field', $phone->field) === NULL ? 'selected' : ''}}>Not specified</option>
 <option value="1" {{old('field', $phone->field) === 1 ? 'selected' : ''}}>Yes</option>
 <option value="0" {{old('field', $phone->field) === 0 ? 'selected' : ''}}>No</option>
</select>


и това трябва да работи без getFieldFormattedAttribute() - т.е. да се махне от модела

Без NULL
от 10+ години опит, това е ДОСТА по-добро решение.

аз бих направил полето в базата данни string или Integer
ако е стринг мога да имам спокойно стойности
- "not_specified"
- "yes"
- "no"
- и други ако ми дойдат после на ум

по принцип NULL Не е добър избор за стойност, защото ако ти си четеш кода няколко месеца по-късно или някой друг го чете, почти сигурно няма да знае какво е NULL (нито 0, нито 1, нито 2 и т.н. затова предлагам стринг)

и после всичко е тип-топ

CODE
<select name="field" id="field" class="select-input">
 <option value="not_specified"  {{old('field', $phone->field) == 'not_specified' ? 'selected' : ''}}>Not specified</option>
 <option value="yes" {{old('field', $phone->field) == 'yes' ? 'selected' : ''}}>Yes</option>
 <option value="no" {{old('field', $phone->field) == 'no' ? 'selected' : ''}}>No</option>
</select>


Това мнение е било редактирано от 7bH5ypIdk9Ij на 12-01-2019, 08:43
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0