Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
есть вот такой запрос
$array_images = DB::table('photo')
->whereIn('photo_symbol_id', $array_symbols_id)
->where('photo_moderation_id','2')
->orderByRaw('RAND()')
->lists('photo_src', 'photo_symbol_id');
на выходе получаю массив
array:4 [
33 => "/img/1479213661вск.png"
28 => "/img/Ы.png"
3 => "/img/В.png"
21 => "/img/Ф.png"
]
где ключ - это photo_symbol_id, Значение - это photo_src
как изменить запрос что бы добавить к результату еще поле photo_id ?
Не в сети
добавь ->select('field','field2')
и ->get() вместо ->lists()
но при этом ты теряешь массив и получаешь объект, с которым можно работать (читай Collections)
Не в сети
добавь ->select('field','field2')
и ->get() вместо ->lists()
но при этом ты теряешь массив и получаешь объект, с которым можно работать (читай Collections)
а что если мне массив нужен?
Не в сети
1. я пока не вижу решения кроме Collection
его практически так же как и массив можно дёргать. тупо синтаксис меняется.
2. можно собрать массив на выхлопе сделав ещё одну итерацию полученых строк === создаёт ненужную нагрузку на процессор и тратит время на генерацию страницы.
Не в сети
и вообще, хочешь массивы - напиши свой фреймворк, попроще.
либо после ->get()
сделай проверку на нул и ->toArray()
советую подумать перед задаванием следующего вопроса.
Изменено hzone (16.11.2016 15:47:55)
Не в сети
Не совсем понятно. Тебе массив нужен с тремя полями вместо двух? И напиши пожалуйста подробнее зачем тебе массив (для select или чего-то еще?), тогда, возможно, найдется элегантное решение.
Не в сети
Не совсем понятно. Тебе массив нужен с тремя полями вместо двух? И напиши пожалуйста подробнее зачем тебе массив (для select или чего-то еще?), тогда, возможно, найдется элегантное решение.
в input вводится текст, этот текст разбивается посимвольно. Каждый символ имеет свой ID. Есть таблица фото, где одно фото связано с одним символом по ID.
этот запрос как раз и выдергивает фото, используя нужные символы
$array_images = DB::table('photo')
->whereIn('photo_symbol_id', $array_symbols_id)
->where('photo_moderation_id','2')
->orderByRaw('RAND()')
->lists('photo_src', 'photo_symbol_id');
в итоге получаю такой массив
array:4 [
33 => "/img/1479213661вск.png"
28 => "/img/Ы.png"
3 => "/img/В.png"
21 => "/img/Ф.png"
]
где ключ - это ID символа,а значение - собственно сама фотка.
проблема в том, что когда изображение создано, юзер может заменить некоторые символы, кликая по нужным фоткам. Для того что бы понять, какую фотку нужно заменить я должен знать ID фото, которую хотят заменить. Именно поэтому мне нужен массив вида
array:4 [
33 => array('photo_id' => 2, 'src' => "/img/1479213661вск.png"),
28 => array('photo_id' => 3, 'src' => "/img/Ы.png"),
3 => array('photo_id' => 4, 'src' => "/img/В.png"),
21 => array('photo_id' => 5, 'src' => "/img/Ф.png"),
]
Не в сети
Вообще, здесь с коллекцией намного проще работать, но если тебе именно массив и именно с такой структурой нужен, сделай что-то вроде этого:
$images = DB::table('photo')
->whereIn('photo_symbol_id', $array_symbols_id)
->where('photo_moderation_id','2')
->orderByRaw('RAND()')
->get(['photo_id', 'photo_src', 'photo_symbol_id']);
$array = [];
foreach($images as $image) {
$array[$image->photo_symbol_id] = ['photo_id' => $image->photo_id, 'src' => $image->photo_src];
};
dd($array);
Не в сети
foreach не прокатит, т.к. всегда в разной последовательности база отдает символы, а мне нужно их выстроить именно в той, в которой они были введены. до того, как понадобилось выводить ID фото это было сделано вот так
$array_images = array_map(function($key) use($array_images){
return array(
"ID" => $key,
"SRC" => $array_images[$key]
);
}, $array_symbols_id);
Изменено respectpick (16.11.2016 17:57:20)
Не в сети
и после преведения запроса к такому виду
$array_images = DB::table('photo')
->whereIn('photo_symbol_id', $array_symbols_id)
->where('photo_moderation_id','2')
->orderByRaw('RAND()')
->select('photo_src', 'photo_symbol_id', 'photo_id')
->get();
выбираются все фото, у которых symbol_id одинаковый.
например ввожу фыв! и получаю две фотки со связанным символом восклицательного знака
Не в сети
Вообще, здесь с коллекцией намного проще работать, но если тебе именно массив и именно с такой структурой нужен, сделай что-то вроде этого:
$images = DB::table('photo') ->whereIn('photo_symbol_id', $array_symbols_id) ->where('photo_moderation_id','2') ->orderByRaw('RAND()') ->get(['photo_id', 'photo_src', 'photo_symbol_id']); $array = []; foreach($images as $image) { $array[$image->photo_symbol_id] = ['photo_id' => $image->photo_id, 'src' => $image->photo_src]; }; dd($array);
это избыточная итерация данных (строк). это не гуд при хайлоад.
нужнго работать с тем, что выплёвывает орм. и это гуд.
я говорил выше, что коллекция - лучший вариант.
Не в сети
так а как решить проблему с дубляцией?
и, собственно, со сборкой массива
Изменено respectpick (16.11.2016 18:31:31)
Не в сети
так а как решить проблему с дубляцией?
и, собственно, со сборкой массива
не городить огород, а работать с тем что отдаёт лара. либо писать свой фреймворк.
Не в сети
простых путей мы не ищем. любим помучать и себя и начальство и соседей.
Не в сети
простых путей мы не ищем. любим помучать и себя и начальство и соседей.
->toArray() кстати не работает, ловлю Exception call to a member function toArray() on array l
Не в сети
$model = Model::where('column','='1)->get();
$array = $model->toArray();
Не в сети
Страницы 1