У меня есть следующее, что я хотел бы упорядочить в алфавитном порядке по ключу, т. Е. Сначала для каждой группы массивов будет «bname», а затем «create_at».
{
"leads": [
{
"lead_id": 1,
"zoho_lead": null,
"bname": "ABC Limited",
"tname": "ABC",
"source_id": 11,
"industry_id": 1,
"user_id": 1,
"created_at": "2017-09-06 15:54:21",
"updated_at": "2017-09-06 15:54:21",
"user": "Sean McCabe",
"source": "Unknown",
"industry": "None"},
{
"lead_id": 2,
"zoho_lead": 51186111981,
"bname": "Business Name Limited",
"tname": "Trading Name",
"source_id": 11,
"industry_id": 1,
"user_id": 1,
"created_at": "2017-06-01 12:34:56",
"updated_at": null,
"user": "John Doe",
"source": "Unknown",
"industry": "None"}
]
}
Я пытаюсь использовать ksort так в цикле foreach:
class LeadController extends Controller
{
use Helpers;
public function index(Lead $leads)
{
$leads = $leads->all();
foreach($leads as $key => $lead){
$lead->user = User::where('id', $lead->user_id)->first()->name;
$lead->source = Source::where('id', $lead->source_id)->first()->name;
$lead->industry = Industry::where('id', $lead->industry_id)->first()->name;
$lead->ksort();
}
return $leads;
}
Но я получаю следующую ошибку:
Call to undefined method Illuminate\\Database\\Query\\Builder::ksort()
Как мне использовать эту функцию, или Laravel способ сделать это, или лучший способ вообще?
Благодарю.
Удалось заставить его возвращаться с ключами в алфавитном порядке, поэтому ниже приводится решение на тот случай, если это потребуется кому-то другому:
public function index(Lead $leads)
{
$leadOut = Array();
$leads = $leads->all();
foreach($leads as $key => $lead){
$lead->user = User::where('id', $lead->user_id)->first()->name;
$lead->source = Source::where('id', $lead->source_id)->first()->name;
$lead->industry = Industry::where('id', $lead->industry_id)->first()->name;
//Convert to Array
$leadOrder = $lead->toArray();
//Sort as desired
ksort($leadOrder);
//Add to array
$leadOut[] = $leadOrder;
}
return $leadOut;
}
Вероятно, есть более чистый способ сделать это, но он работает для моего случая, и, возможно, могут быть размещены дополнительные ответы, которые лучше.
Вы могли бы сделать что-то вроде:
return Lead::with('user', 'source', 'industry')->get()->map(function ($lead) {
$item = $lead->toArray();
$item['user'] = $lead->user->name;
$item['source'] = $lead->source->name;
$item['industry'] = $lead->industry->name;
ksort($item);
return $item;
});
Это должно быть гораздо более эффективным, поскольку оно будет загружать отношения, а не делать 3 дополнительных запроса для каждой итерации.