Laravel по-русски

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

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

#1 16.11.2016 13:21:40

respectpick
Откуда: Москва
Сообщений: 83

Добавить одно поле в выборку

есть вот такой запрос

        $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 ?

Не в сети

#2 16.11.2016 14:05:29

Re: Добавить одно поле в выборку

добавь ->select('field','field2')
и ->get() вместо ->lists()
но при этом ты теряешь массив и получаешь объект, с которым можно работать (читай Collections)

Не в сети

#3 16.11.2016 15:22:03

respectpick
Откуда: Москва
Сообщений: 83

Re: Добавить одно поле в выборку

hzone пишет:

добавь ->select('field','field2')
и ->get() вместо ->lists()
но при этом ты теряешь массив и получаешь объект, с которым можно работать (читай Collections)

а что если мне массив нужен?

Не в сети

#4 16.11.2016 15:46:23

Re: Добавить одно поле в выборку

1. я пока не вижу решения кроме Collection
его практически так же как и массив можно дёргать. тупо синтаксис меняется.
2. можно собрать массив на выхлопе сделав ещё одну итерацию полученых строк === создаёт ненужную нагрузку на процессор и тратит время на генерацию страницы.

Не в сети

#5 16.11.2016 15:46:52

Re: Добавить одно поле в выборку

и вообще, хочешь массивы - напиши свой фреймворк, попроще.

либо после ->get()
сделай проверку на нул и ->toArray()

советую подумать перед задаванием следующего вопроса.

Изменено hzone (16.11.2016 15:47:55)

Не в сети

#6 16.11.2016 15:54:27

Re: Добавить одно поле в выборку

Не совсем понятно. Тебе массив нужен с тремя полями вместо двух? И напиши пожалуйста подробнее зачем тебе массив (для select или чего-то еще?), тогда, возможно, найдется элегантное решение.

Не в сети

#7 16.11.2016 17:10:13

respectpick
Откуда: Москва
Сообщений: 83

Re: Добавить одно поле в выборку

AlexeyMezenin пишет:

Не совсем понятно. Тебе массив нужен с тремя полями вместо двух? И напиши пожалуйста подробнее зачем тебе массив (для 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"),
]

Не в сети

#8 16.11.2016 17:48:38

Re: Добавить одно поле в выборку

Вообще, здесь с коллекцией намного проще работать, но если тебе именно массив и именно с такой структурой нужен, сделай что-то вроде этого:

$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);

Не в сети

#9 16.11.2016 17:52:19

respectpick
Откуда: Москва
Сообщений: 83

Re: Добавить одно поле в выборку

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)

Не в сети

#10 16.11.2016 17:56:01

respectpick
Откуда: Москва
Сообщений: 83

Re: Добавить одно поле в выборку

и после преведения запроса к такому виду

        $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 одинаковый.

например ввожу фыв! и получаю две фотки со связанным символом восклицательного знака

Не в сети

#11 16.11.2016 18:28:20

Re: Добавить одно поле в выборку

AlexeyMezenin пишет:

Вообще, здесь с коллекцией намного проще работать, но если тебе именно массив и именно с такой структурой нужен, сделай что-то вроде этого:

$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);

это избыточная итерация данных (строк). это не гуд при хайлоад.
нужнго работать с тем, что выплёвывает орм. и это гуд.

я говорил выше, что коллекция - лучший вариант.

Не в сети

#12 16.11.2016 18:31:06

respectpick
Откуда: Москва
Сообщений: 83

Re: Добавить одно поле в выборку

так а как решить проблему с дубляцией?

и, собственно, со сборкой массива

Изменено respectpick (16.11.2016 18:31:31)

Не в сети

#13 16.11.2016 18:58:14

Re: Добавить одно поле в выборку

respectpick пишет:

так а как решить проблему с дубляцией?

и, собственно, со сборкой массива

не городить огород, а работать с тем что отдаёт лара. либо писать свой фреймворк.

Не в сети

#14 16.11.2016 18:58:39

Re: Добавить одно поле в выборку

простых путей мы не ищем. любим помучать и себя и начальство и соседей.

Не в сети

#15 16.11.2016 19:01:38

respectpick
Откуда: Москва
Сообщений: 83

Re: Добавить одно поле в выборку

hzone пишет:

простых путей мы не ищем. любим помучать и себя и начальство и соседей.

->toArray() кстати не работает, ловлю Exception call to a member function toArray() on array l

Не в сети

#16 16.11.2016 21:24:09

Re: Добавить одно поле в выборку

$model = Model::where('column','='1)->get();
$array = $model->toArray();

Не в сети

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