Laravel по-русски

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

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

#1 18.11.2016 19:11:20

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

Как не избегать дублирования

На вход поступает массив из ID символов. И таким запросом получаю картинки, которые соответствуют этим символам

        $array_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']);

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

Пример: если ввожу в инпут "фыв" то массив входных символов такой

array:3 [
  0 => "28"
  1 => "21"
  2 => "3"

и получаю 3 картинки, соотвествующие этим символам.

Но если ввожу фразу "фывфыв", получаю массив

array:6 [
  0 => "28"
  1 => "21"
  2 => "3"
  3 => "21"
  4 => "28"
  5 => "3"
]

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

Не в сети

#2 18.11.2016 19:59:14

Re: Как не избегать дублирования

При отображении пройдись по $array_symbols_id с помощью foreach() и отображай картинки через что-то вроде $array_images->where('photo_symbol_id', $array_symbols_id[4])->first()->photo_src

Не в сети

#3 18.11.2016 21:11:48

Re: Как не избегать дублирования

мужик smile ты мозги проел рандомом и генератором картинок от рандома.
мухахахахахахаха!!!

Не в сети

#4 21.11.2016 10:22:22

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

Re: Как не избегать дублирования

AlexeyMezenin пишет:

При отображении пройдись по $array_symbols_id с помощью foreach() и отображай картинки через что-то вроде $array_images->where('photo_symbol_id', $array_symbols_id[4])->first()->photo_src

говорят, запросы по циклу в базу слать не есть хорошо

Не в сети

#5 21.11.2016 10:40:56

Re: Как не избегать дублирования

respectpick пишет:

говорят, запросы по циклу в базу слать не есть хорошо

Правильно говорят, но здесь ты не посылаешь запросы в базу, а проходишь по коллекции.

Не в сети

#6 21.11.2016 10:44:21

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

Re: Как не избегать дублирования

        $array_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']);

разве это коллекция?

Не в сети

#7 21.11.2016 10:50:47

Re: Как не избегать дублирования

respectpick пишет:

разве это коллекция?

Да. Если после запроса вставить это, можно посмотреть коллекция это или что-то другое:

dd($array_images);

Изменено AlexeyMezenin (21.11.2016 10:52:38)

Не в сети

#8 21.11.2016 10:54:02

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

Re: Как не избегать дублирования

AlexeyMezenin пишет:
respectpick пишет:

разве это коллекция?

Да. Если после запроса вставить это, можно посмотреть коллекция это или что-то другое:

dd($array_images);

если я все правильно понял вы предлагаете сделать так

        foreach($array_symbols_id as $symbol){
            $array_images[] = DB::table('photo')
                ->where('photo_symbol_id', $symbol)
                ->where('photo_moderation_id','2')
                ->orderByRaw('RAND()')
                ->get(['photo_id', 'photo_src', 'photo_symbol_id']);
        }

?

Не в сети

#9 21.11.2016 10:58:57

Re: Как не избегать дублирования

respectpick пишет:

если я все правильно понял вы предлагаете сделать так

        foreach($array_symbols_id as $symbol){
            $array_images[] = DB::table('photo')
                ->where('photo_symbol_id', $symbol)
                ->where('photo_moderation_id','2')
                ->orderByRaw('RAND()')
                ->get(['photo_id', 'photo_src', 'photo_symbol_id']);
        }

Нет. Сначала получаешь коллекцию с помощью запроса, потом работаешь с ней, например:

$array_images = DB::table('photo')
                ->where('photo_symbol_id', $symbol)
                ->where('photo_moderation_id','2')
                ->orderByRaw('RAND()')
                ->get(['photo_id', 'photo_src', 'photo_symbol_id'])

$array = [];

foreach ($array_symbols_id as $id) {
    $array[] = $array_images->where('photo_symbol_id', $array_symbols_id[$id])->first()->photo_src;
}

Не в сети

#10 21.11.2016 11:03:51

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

Re: Как не избегать дублирования

у меня после DB::table уже 3 картинки отдаются вместо введенных шести

Не в сети

#11 21.11.2016 11:15:26

Re: Как не избегать дублирования

respectpick пишет:

у меня после DB::table уже 3 картинки отдаются вместо введенных шести

Смысл в том, чтобы пройтись по шести ID и построить массив из всех шести картинок и потом их отобразить.

Не в сети

#12 21.11.2016 11:19:28

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

Re: Как не избегать дублирования

да, я понимаю, но сам запрос, который приходит в array_images

$array_images = DB::table('photo')
                ->where('photo_symbol_id', $array_symbols_id)
                ->where('photo_moderation_id','2')
                ->orderByRaw('RAND()')
                ->get(['photo_id', 'photo_src', 'photo_symbol_id'])

$array = [];

foreach ($array_symbols_id as $id) {
    $array[] = $array_images->where('photo_symbol_id', $array_symbols_id[$id])->first()->photo_src;
}

уже отсекает 3 символа. Т.е. если я введу 6 разных символов, то тогда все нормально, я и получу 6 разных картинок. А если я ввожу повторяющиеся символы, например "фывфыв" то этот запрос мне возвратит только картинки, связанные с символами "ф","ы","в". В этом, собственно и суть темы ))

Не в сети

#13 21.11.2016 11:22:24

Re: Как не избегать дублирования

respectpick пишет:

уже отсекает 3 символа. Т.е. если я введу 6 разных символов, то тогда все нормально, я и получу 6 разных картинок. А если я ввожу повторяющиеся символы, например "фывфыв" то этот запрос мне возвратит только картинки, связанные с символами "ф","ы","в". В этом, собственно и суть темы ))

Все верно, запрос отсекает дубликаты, потом ты строишь массив со всеми 6 символами, включая дубликаты.

Не в сети

#14 21.11.2016 11:28:32

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

Re: Как не избегать дублирования

вот тут exception ловлю

$array[] = $array_images->where('photo_symbol_id', $array_symbols_id[$id])->first()->photo_src;

Call to a member function where() on array

Не в сети

#15 21.11.2016 12:37:33

Re: Как не избегать дублирования

respectpick пишет:

Call to a member function where() on array

Только что протестировал, этот код должен вернуть коллекцию:

DB::table('photo')
                ->where('photo_symbol_id', $array_symbols_id)
                ->where('photo_moderation_id','2')
                ->orderByRaw('RAND()')
                ->get(['photo_id', 'photo_src', 'photo_symbol_id'])

После этого where() без проблем ищет по коллекции, но у тебя почему-то там массив получился.

Ты после этого кода что-то делаешь с результатом? Например, ->toArray() или что-то подобное?

И что у тебя показывает вот это:

dd(DB::table('photo')
                ->where('photo_symbol_id', $array_symbols_id)
                ->where('photo_moderation_id','2')
                ->orderByRaw('RAND()')
                ->get(['photo_id', 'photo_src', 'photo_symbol_id']));

Не в сети

#16 30.11.2016 17:31:01

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

Re: Как не избегать дублирования

AlexeyMezenin пишет:
respectpick пишет:

Call to a member function where() on array

Только что протестировал, этот код должен вернуть коллекцию:

DB::table('photo')
                ->where('photo_symbol_id', $array_symbols_id)
                ->where('photo_moderation_id','2')
                ->orderByRaw('RAND()')
                ->get(['photo_id', 'photo_src', 'photo_symbol_id'])

После этого where() без проблем ищет по коллекции, но у тебя почему-то там массив получился.

Ты после этого кода что-то делаешь с результатом? Например, ->toArray() или что-то подобное?

И что у тебя показывает вот это:

dd(DB::table('photo')
                ->where('photo_symbol_id', $array_symbols_id)
                ->where('photo_moderation_id','2')
                ->orderByRaw('RAND()')
                ->get(['photo_id', 'photo_src', 'photo_symbol_id']));

после этого кода с результатом ничего не делаю.
показывает вот это

array:3 [▼
  0 => {#295 ▶}
  1 => {#294 ▶}
  2 => {#292 ▶}
]

Не в сети

#17 30.11.2016 17:50:17

Re: Как не избегать дублирования

respectpick пишет:

после этого кода с результатом ничего не делаю.
показывает вот это

array:3 [▼
  0 => {#295 ▶}
  1 => {#294 ▶}
  2 => {#292 ▶}
]

Странно, попробовал в 5.3, у меня показывает коллекцию. Под рукой нет 5.0, чтобы проверить, попробуй как посоветовал тебе индус, через select().

Изменено AlexeyMezenin (30.11.2016 17:51:21)

Не в сети

#18 30.11.2016 18:00:11

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

Re: Как не избегать дублирования

в доке написано

array|Builder[] get(array $columns = array('*'))

Execute the query as a "select" statement.

Parameters
array    $columns   

Return Value
array|Builder[]

Не в сети

#19 30.11.2016 18:01:45

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

Re: Как не избегать дублирования

если вместо get использую select получаю такую вот шляпу

Builder {#290 ▼
  #connection: MySqlConnection {#284 ▶}
  #grammar: MySqlGrammar {#286 ▶}
  #processor: MySqlProcessor {#288}
  #bindings: array:5 [▶]
  +aggregate: null
  +columns: array:3 [▶]
  +distinct: false
  +from: "photo"
  +joins: null
  +wheres: array:2 [▶]
  +groups: null
  +havings: null
  +orders: array:1 [▶]
  +limit: null
  +offset: null
  +unions: null
  +unionLimit: null
  +unionOffset: null
  +unionOrders: null
  +lock: null
  #backups: []
  #operators: array:26 [▶]
  #useWritePdo: false
}

Не в сети

#20 30.11.2016 18:06:20

Re: Как не избегать дублирования

respectpick пишет:

если вместо get использую select получаю такую вот шляпу

После select простой get() нужен (без аргументов).

Изменено AlexeyMezenin (30.11.2016 18:07:36)

Не в сети

#21 30.11.2016 18:08:24

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

Re: Как не избегать дублирования

на stackoverflow написали такое

In Laravel 5.0, DB returns an array and Model returns collections, so you can make it a collection by using collect():

$array_images = collect(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']));

теперь, когда распечатываю массив получаю

Collection {#290 ▼
  #items: array:3 [▶]
}

Не в сети

#22 30.11.2016 18:12:10

Re: Как не избегать дублирования

Да, вижу, я так и понял, что есть отличия в версиях. Апвоутнул тебя там. )

Не в сети

#23 30.11.2016 18:22:42

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

Re: Как не избегать дублирования

а разве эта штука

$array[] = $array_images->where('photo_symbol_id', $array_symbols_id[$id])->first()->photo_src;

не будет возвращать всегда одну и ту же картинку?

Не в сети

#24 30.11.2016 18:31:55

Re: Как не избегать дублирования

respectpick пишет:

не будет возвращать всегда одну и ту же картинку?

Я этот код для примера дал. Суть в том, чтобы искать по коллекции запись по ID с помощью where()->first(). Подстрой его под свои данные.

Изменено AlexeyMezenin (30.11.2016 18:32:23)

Не в сети

#25 30.11.2016 18:44:33

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

Re: Как не избегать дублирования

AlexeyMezenin пишет:
respectpick пишет:

не будет возвращать всегда одну и ту же картинку?

Я этот код для примера дал. Суть в том, чтобы искать по коллекции запись по ID с помощью where()->first(). Подстрой его под свои данные.

а как можно одной строкой получить не только photo_src,  а чтоб массив был из трех данных?

$array_images[] = $collection->where('photo_symbol_id', $id)->first()->photo_src->photo_id->photo_symbol_id

что-нибудь типа такого?

Не в сети

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