Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
1. Laravel 5.4
Не могу понять, как записать массив данных в 1 ячейку, с возможностью добавлять в массив еще данных.
Например, мы имеем строку, и нужно в одну из ее ячеек записать имена: Андрей, Сергей, Вадим. И иметь возможность добавлять еще имена.
Далее надо выгрузить массив и выбрать рандомно одно имя.
Прошу помощи у знатоков
Изменено LesoRub (02.07.2017 15:11:46)
Не в сети
JSON Вам в помощь.
Перед занесением в БД кодируйте массив в JSON, после извлечения из БД декодируйте JSON-строку.
Не в сети
если используется элоквент, можно в $casts определить тип нужного поля как array – в этом случае он будет превращаться в json и обратно в массив автоматически.
class Record extends Model
{
protected $casts = [
'names' => 'array',
];
}
теперь если сделать $record->names = ['John', 'Jane']; и $record->save(); в таблице для записи массив будет сохранён как json. потом при выборке этой записи $record->names будет уже массивом, его не нужно будет декодировать каждый раз…
Не в сети
если используется элоквент, можно в $casts определить тип нужного поля как array – в этом случае он будет превращаться в json и обратно в массив автоматически.class Record extends Model
{
protected $casts = [
'names' => 'array',
];
}теперь если сделать $record->names = ['John', 'Jane']; и $record->save(); в таблице для записи массив будет сохранён как json. потом при выборке этой записи $record->names будет уже массивом, его не нужно будет декодировать каждый раз…
Спасибо большое! Подскажите функцию которая рандомно выберет 1 имя из полученного массива? и запишет имя в пустую ячейку. Как записать я знаю, а вот как рандомно выбрать.
Не в сети
$names = ['one', 'two', 'three'];
$randomName = $names[rand(0, count($names) - 1)];
потыкать - http://sandbox.onlinephpfunctions.com/c … 671352c820
Изменено covobo (02.07.2017 22:26:22)
Не в сети
во-первых, rand уже давно deprecated, заменена на mt_rand. во-вторых для выбора случайного ключа из массива есть array_rand() – он работает в том числе и с ассоциативными массивами…
$name = $names[array_rand($names)]
Не в сети
во-первых, 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)
Не в сети
- Раз уж пошли замечания, то и я добавлю — array_rand использует libc генератор, который медленнее алгоритма rand/mt_rand/etc…
array_rand() использует тот же генератор, что и rand(), то есть для PHP < 7.1 — libc, выше — MT (тот же, что в mt_rand()).
ИМХО, лучше привыкать во всех без исключения случаях использовать mt_rand(), так как rand() даже в далёких от криптографии применениях может выдавать результаты, «не очень» похожие на случайные, что может иногда вызвать вопросы. На Хабре есть показательная картинка как раз на эту тему:
Не в сети
Я и не думал что у Laravel такое дружелюбное комьюнити. Большое спасибо всем за помощь!
На счет записи массива в БД, всё работает, записывает, но если мне нужно дополнить массив? Добавить новое имя к уже существующему массиву. Тот способ что подсказали выше, он обнуляет старые значения и добавляет новое
Изменено LesoRub (03.07.2017 12:40:27)
Не в сети
Тот способ что подсказали выше, он обнуляет старые значения и добавляет новое
покажи код как именно добавляешь
Не в сети
покажи код как именно добавляешь
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)
Не в сети
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)
Не в сети
Я это реализую, как JSON, здесь, на сайте есть статья на эту тему, откуда и взял сей способ на вооружение.
Все нормально работает, но, конечно, приходится учитывать - MySQL должен быть версии не ниже 5.7
Не в сети
Я это реализую, как JSON, здесь, на сайте есть статья на эту тему, откуда и взял сей способ на вооружение.Все нормально работает, но, конечно, приходится учитывать - MySQL должен быть версии не ниже 5.7
Своей цели я добился, теперь я могу дополнять ячейку новыми именами.
В конечном итоге, при выборке у меня есть массив с именами:
array:3 [▼
0 => "LesoRub"
1 => "LesoRub"
2 => "LesoRub"
]
Как этот массив передать в шаблон? Так как я хочу выполнить проверку, если пользователь есть в массиве, то кнопка disabled="disabled" если нету то кнопка включена.
Не в сети
В БД столбец 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
Не в сети
@if (in_array($currentUserName, $item->names, true))
…
@else
…
@endif
Не в сети
@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)
Не в сети
Я выше, написал, как. Может и неидеально, сам не так давно во всем этом, но работает.
Не в сети
Решил вот так: @if(in_array($lottery->nickname, json_decode($test->party, true), true))
Не в сети
Страницы 1