Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
На вход поступает массив из 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"
]
то в итоге получаю опять же те три картинки, а мне надо что бы они вывелись по два раза
Не в сети
При отображении пройдись по $array_symbols_id с помощью foreach() и отображай картинки через что-то вроде $array_images->where('photo_symbol_id', $array_symbols_id[4])->first()->photo_src
Не в сети
мужик ты мозги проел рандомом и генератором картинок от рандома.
мухахахахахахаха!!!
Не в сети
При отображении пройдись по $array_symbols_id с помощью foreach() и отображай картинки через что-то вроде $array_images->where('photo_symbol_id', $array_symbols_id[4])->first()->photo_src
говорят, запросы по циклу в базу слать не есть хорошо
Не в сети
говорят, запросы по циклу в базу слать не есть хорошо
Правильно говорят, но здесь ты не посылаешь запросы в базу, а проходишь по коллекции.
Не в сети
$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']);
разве это коллекция?
Не в сети
разве это коллекция?
Да. Если после запроса вставить это, можно посмотреть коллекция это или что-то другое:
dd($array_images);
Изменено AlexeyMezenin (21.11.2016 10:52:38)
Не в сети
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']);
}
?
Не в сети
если я все правильно понял вы предлагаете сделать так
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;
}
Не в сети
у меня после DB::table уже 3 картинки отдаются вместо введенных шести
Не в сети
у меня после DB::table уже 3 картинки отдаются вместо введенных шести
Смысл в том, чтобы пройтись по шести ID и построить массив из всех шести картинок и потом их отобразить.
Не в сети
да, я понимаю, но сам запрос, который приходит в 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 разных картинок. А если я ввожу повторяющиеся символы, например "фывфыв" то этот запрос мне возвратит только картинки, связанные с символами "ф","ы","в". В этом, собственно и суть темы ))
Не в сети
уже отсекает 3 символа. Т.е. если я введу 6 разных символов, то тогда все нормально, я и получу 6 разных картинок. А если я ввожу повторяющиеся символы, например "фывфыв" то этот запрос мне возвратит только картинки, связанные с символами "ф","ы","в". В этом, собственно и суть темы ))
Все верно, запрос отсекает дубликаты, потом ты строишь массив со всеми 6 символами, включая дубликаты.
Не в сети
вот тут exception ловлю
$array[] = $array_images->where('photo_symbol_id', $array_symbols_id[$id])->first()->photo_src;
Call to a member function where() on array
Не в сети
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']));
Не в сети
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 ▶}
]
Не в сети
после этого кода с результатом ничего не делаю.
показывает вот этоarray:3 [▼ 0 => {#295 ▶} 1 => {#294 ▶} 2 => {#292 ▶} ]
Странно, попробовал в 5.3, у меня показывает коллекцию. Под рукой нет 5.0, чтобы проверить, попробуй как посоветовал тебе индус, через select().
Изменено AlexeyMezenin (30.11.2016 17:51:21)
Не в сети
в доке написано
array|Builder[] get(array $columns = array('*'))
Execute the query as a "select" statement.
Parameters
array $columns
Return Value
array|Builder[]
Не в сети
если вместо 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
}
Не в сети
если вместо get использую select получаю такую вот шляпу
После select простой get() нужен (без аргументов).
Изменено AlexeyMezenin (30.11.2016 18:07:36)
Не в сети
на 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 [▶]
}
Не в сети
Да, вижу, я так и понял, что есть отличия в версиях. Апвоутнул тебя там. )
Не в сети
а разве эта штука
$array[] = $array_images->where('photo_symbol_id', $array_symbols_id[$id])->first()->photo_src;
не будет возвращать всегда одну и ту же картинку?
Не в сети
не будет возвращать всегда одну и ту же картинку?
Я этот код для примера дал. Суть в том, чтобы искать по коллекции запись по ID с помощью where()->first(). Подстрой его под свои данные.
Изменено AlexeyMezenin (30.11.2016 18:32:23)
Не в сети
respectpick пишет:не будет возвращать всегда одну и ту же картинку?
Я этот код для примера дал. Суть в том, чтобы искать по коллекции запись по ID с помощью where()->first(). Подстрой его под свои данные.
а как можно одной строкой получить не только photo_src, а чтоб массив был из трех данных?
$array_images[] = $collection->where('photo_symbol_id', $id)->first()->photo_src->photo_id->photo_symbol_id
что-нибудь типа такого?
Не в сети