2015-07-23 5 views
1

Мне часто очень полезно индексировать мои результаты с помощью идентификатора первичного ключа.Laravel Eloquent get() с индексом первичного ключа

Пример:

$out = []; 

$users = User::where('created_at', '>=', '2015-01-01')->get(); 

foreach ($users as $user) { 
    $out[$user->id] = $user; 
} 

return $out; 

Есть в любом случае сделать это в одном кадре с красноречив? Не полезно использовать индекс 0 ... n.

+0

Просто из интереса, что случай использования здесь? – Wader

+0

@Wader Вариант использования заключается в том, что я получаю быстрый поиск первичного ключа. isset ($ out [2134]) - постоянный поиск из-за hashmap. Вместо того, чтобы делать цикл for для поиска 2134 – Yada

+0

Извините, если я неправильно понял, но это не то, что [$ collection-> getDictionary()] (http://laravel.com/api/5.1/Illuminate/Database/ Eloquent/Collection.html # method_getDictionary) делает? Итак: '$ users = User :: where ('created_at', '> =', '2015-01-01') -> get() -> getDictionary();' –

ответ

4

Вы можете сделать это с помощью getDictionary() на вашей коллекции.

Как так:

$users = User::where('created_at', '>=', '2015-01-01')->get()->getDictionary(); 
0

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

$users = Users::all(); 

return array_combine($users->modelKeys(), $users); 
1

Я создал свое собственное решение, получив супер-модель, которая расширяет яркость.

Полное решение: https://gist.github.com/yadakhov/741173ae893c1042973b

/** 
* Where In Hashed by primary key 
* 
* @param array $ids 
* @return array 
*/ 
public static function whereInHash(array $ids, $column = 'primaryKey') 
{ 
    $modelName = get_called_class(); 
    $primaryKey = static::getPrimaryKey(); 
    if ($column === 'primaryKey') { 
     $column = $primaryKey; 
    } 
    $rows = $modelName::whereIn($column, $ids)->get(); 
    $out = []; 
    foreach ($rows as $row) { 
     $out[$row->$primaryKey] = $row; 
    } 
    return $out; 
} 
Смежные вопросы