Laravel по-русски

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

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

#1 02.07.2017 15:05:59

Запись массива в одну ячейку БД MySQL

1. Laravel 5.4

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

Например, мы имеем строку, и нужно в одну из ее ячеек записать имена: Андрей, Сергей, Вадим. И иметь возможность добавлять еще имена.
Далее надо выгрузить массив и выбрать рандомно одно имя.
Прошу помощи у знатоков smile

Изменено LesoRub (02.07.2017 15:11:46)

Не в сети

#2 02.07.2017 15:42:44

Re: Запись массива в одну ячейку БД MySQL

JSON Вам в помощь.
Перед занесением в БД кодируйте массив в JSON, после извлечения из БД декодируйте JSON-строку.

Не в сети

#3 02.07.2017 16:53:34

Re: Запись массива в одну ячейку БД MySQL

если используется элоквент, можно в $casts определить тип нужного поля как array – в этом случае он будет превращаться в json и обратно в массив автоматически.

class Record extends Model
{
    protected $casts = [
        'names' => 'array',
    ];
}

теперь если сделать $record->names = ['John', 'Jane']; и $record->save(); в таблице для записи массив будет сохранён как json. потом при выборке этой записи $record->names будет уже массивом, его не нужно будет декодировать каждый раз…

Не в сети

#4 02.07.2017 21:29:42

Re: Запись массива в одну ячейку БД MySQL

если используется элоквент, можно в $casts определить тип нужного поля как array – в этом случае он будет превращаться в json и обратно в массив автоматически.class Record extends Model
{
    protected $casts = [
        'names' => 'array',
    ];
}теперь если сделать $record->names = ['John', 'Jane']; и $record->save(); в таблице для записи массив будет сохранён как json. потом при выборке этой записи $record->names будет уже массивом, его не нужно будет декодировать каждый раз…

Спасибо большое! Подскажите функцию которая рандомно выберет 1 имя из полученного массива? и запишет имя в пустую ячейку. Как записать я знаю, а вот как рандомно выбрать.

Не в сети

#5 02.07.2017 22:25:05

Re: Запись массива в одну ячейку БД MySQL

$names = ['one', 'two', 'three'];
$randomName = $names[rand(0, count($names) - 1)];

потыкать - http://sandbox.onlinephpfunctions.com/c … 671352c820

Изменено covobo (02.07.2017 22:26:22)

Не в сети

#6 03.07.2017 05:59:17

Re: Запись массива в одну ячейку БД MySQL

во-первых, rand уже давно deprecated, заменена на mt_rand. во-вторых для выбора случайного ключа из массива есть array_rand() – он работает в том числе и с ассоциативными массивами…

$name = $names[array_rand($names)]

Не в сети

#7 03.07.2017 10:25:07

Re: Запись массива в одну ячейку БД MySQL

во-первых, rand уже давно deprecated, заменена на mt_rand. во-вторых для выбора случайного ключа из массива есть array_rand() – он работает в том числе и с ассоциативными массивами…

Простите сэр, но я вас поправлю.
В каком месте deprecated http://php.net/rand (мы же современные разработчики)?
Ну, а что во вторых? Еще один способ получения случайного значения.
Раз уж пошли замечания, то и я добавлю - array_rand использует libc генератор, который медленнее алгоритма rand/mt_rand/etc..

Я думаю, ваш способ поможет и другим участникам форума, особенно в случае с ассоциативными массивами.

Изменено covobo (03.07.2017 10:26:54)

Не в сети

#8 03.07.2017 12:08:18

Re: Запись массива в одну ячейку БД MySQL

  1. Раз уж пошли замечания, то и я добавлю — array_rand использует libc генератор, который медленнее алгоритма rand/mt_rand/etc…

array_rand() использует тот же генератор, что и rand(), то есть для PHP < 7.1 — libc, выше — MT (тот же, что в mt_rand()).

ИМХО, лучше привыкать во всех без исключения случаях использовать mt_rand(), так как rand() даже в далёких от криптографии применениях может выдавать результаты, «не очень» похожие на случайные, что может иногда вызвать вопросы. На Хабре есть показательная картинка как раз на эту тему:

https://hsto.org/storage2/927/06e/464/92706e46478df4040ec6e77061d0e2ae.png https://hsto.org/storage2/28c/f97/64b/28cf9764be295de25f72cc158d110375.png
Узор справа видно даже на глаз.

Не в сети

#9 03.07.2017 12:38:54

Re: Запись массива в одну ячейку БД MySQL

Я и не думал что у Laravel такое дружелюбное комьюнити. Большое спасибо всем за помощь!

На счет записи массива в БД, всё работает, записывает, но если мне нужно дополнить массив?  Добавить новое имя к уже существующему массиву. Тот способ что подсказали выше, он обнуляет старые значения и добавляет новое sad

Изменено LesoRub (03.07.2017 12:40:27)

Не в сети

#10 03.07.2017 12:45:28

Re: Запись массива в одну ячейку БД MySQL

Тот способ что подсказали выше, он обнуляет старые значения и добавляет новое

покажи код как именно добавляешь

Не в сети

#11 03.07.2017 12:58:10

Re: Запись массива в одну ячейку БД MySQL

покажи код как именно добавляешь

public function lottery(Request $r){
        $lottery = Lottery::find(2);
        $test = Test::find(1);
        
      if($lottery->open >=10){
            $test->party = [$lottery->nickname];
            $test->sum = + 1;
            $test->save();
          
            Session::flash('success', 'Спасибо что приянли участие в нашем розыгрыше! Удачи! ;)');
            Session::flash('types','info');
          return redirect()->back(); 
      }else{
        $result = 10 - $lottery->open;
        Session::flash('opoweshenie', $result);
        Session::flash('types','error');
         return redirect()->back();    
      }
   
  }

Изменено LesoRub (03.07.2017 12:58:53)

Не в сети

#12 03.07.2017 13:00:00

Re: Запись массива в одну ячейку БД MySQL

public function lottery(Request $r)
{
        $lottery = Lottery::find(2);
        $test = Test::find(1);
        
      if ($lottery->opencase >=10) {
            $test->party[] = $lottery->nickname;
            $test->sum = + 1;
            $test->save();
          
            Session::flash('success', 'Спасибо что приянли участие в нашем розыгрыше! Удачи! ;)');
            Session::flash('types','info');
           return redirect()->back(); 
      } else {
        $result = 10 - $lottery->opencase;
        Session::flash('opoweshenie', $result);
        Session::flash('types','error');
        return redirect()->back();    
      }
  }

если я правильно предположил.

Изменено covobo (03.07.2017 13:00:09)

Не в сети

#13 03.07.2017 13:57:23

Re: Запись массива в одну ячейку БД MySQL

Я это реализую, как JSON, здесь, на сайте есть статья на эту тему, откуда и взял сей способ на вооружение.
Все нормально работает, но, конечно, приходится учитывать - MySQL должен быть версии не ниже 5.7

Не в сети

#14 04.07.2017 05:58:36

Re: Запись массива в одну ячейку БД MySQL

Я это реализую, как JSON, здесь, на сайте есть статья на эту тему, откуда и взял сей способ на вооружение.Все нормально работает, но, конечно, приходится учитывать - MySQL должен быть версии не ниже 5.7

Своей цели я добился, теперь я могу дополнять ячейку новыми именами.
В конечном итоге, при выборке у меня есть массив с именами:

array:3 [▼
  0 => "LesoRub"
  1 => "LesoRub"
  2 => "LesoRub"
]

Как этот массив передать в шаблон? Так как я хочу выполнить проверку, если пользователь есть в массиве, то кнопка disabled="disabled" если нету то кнопка включена.

Не в сети

#15 04.07.2017 07:39:04

Re: Запись массива в одну ячейку БД MySQL

В БД столбец styles такой (css-стили для разного вида сущности раличны):

{"css_pic": "nomination_1", "type_icon": "<i class='fa fa-female' aria-hidden='true'></i>", "css_header": "woman", "css_img_nommi": "strongwoman_1", "css_img_rules": "rules_1"}

В контроллере примерно так:

$nomination = Nomination::with('competitors')
  ->with('referees')
  ->find($id);

if (!empty($nomination->styles)) {
    foreach (json_decode($nomination->styles, true) as $key => $value) {
       array_add($nomination, $key, $value);
    }
}

...

return view('nomination.show', ['nomination' => $nomination]);

А в шаблоне, соответственно, как-то так

@if (...)
<img class="{{$nomination->css_img_nommi}}" src="{{asset($nomination->pic)}}" >
@else
...
@endif

Не в сети

#16 04.07.2017 10:52:37

Re: Запись массива в одну ячейку БД MySQL

@if (in_array($currentUserName, $item->names, true))
    …
@else
    …
@endif

Не в сети

#17 05.07.2017 10:58:19

Re: Запись массива в одну ячейку БД MySQL

@if (in_array($currentUserName, $item->names, true))
    …
@else
    …
@endif

Как проверку сделать я знаю, а вот передать сам массив не получается.

Преобразовал в массив

$sql = $test->party;
$pieces = explode("|", $sql);
array:1[▼
  0 => "Wlof"
  1 => "Leso"
  2 => "Dusy"
  3 => "Vova"
  4 => "Kosty"
  5 => "Zola"
  6 => "Wlof"
]

Пробовал передать так

return view('welcome')>with([
            'pieces'=>$pieces
        ]);

И так

return view('welcome', ['pieces' => $pieces]);

Ошибка Undefined variable: pieces

Изменено LesoRub (05.07.2017 11:02:28)

Не в сети

#18 05.07.2017 11:01:19

Re: Запись массива в одну ячейку БД MySQL

Я выше, написал, как. Может и неидеально, сам не так давно во всем этом, но работает.

Не в сети

#19 05.07.2017 18:40:08

Re: Запись массива в одну ячейку БД MySQL

Решил вот так: @if(in_array($lottery->nickname, json_decode($test->party, true), true))

Не в сети

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