I have got an array that looks like this:
^ Illuminate\Support\Collection {#2057 ▼
#items: array:2 [▼
"pizza" => 2
"cookking vuurschaal palma" => 1
]
}
does anyone know how to sort by value instead of keys in Laravel?
Collection::sortDesc(); worked for me
Related
Is there any laravel collection methold that i dont know of, which would allow me to sort an array based on the number of elements on the sub array?
Illuminate\Support\Collection {#1143 ▼
#items: array:7 [▼
"A" => Illuminate\Support\Collection {#21181 ▼
#items: array:10 [▶]
}
"B" => Illuminate\Support\Collection {#21182 ▼
#items: array:8 [▶]
}
"C" => Illuminate\Support\Collection {#21183 ▼
#items: array:9 [▶]
}
"D" => Illuminate\Support\Collection {#21184 ▼
#items: array:5 [▶]
}
"E" => Illuminate\Support\Collection {#21185 ▼
#items: array:2 [▶]
}
"F" => Illuminate\Support\Collection {#21186 ▼
#items: array:4 [▶]
}
"G" => Illuminate\Support\Collection {#21187 ▼
#items: array:15 [▶]
}
]
}
I could do something like THIS using usort() but I was just wondering if there exists any method within laravel collections, which I yet dont know or may be I am not able to locate it within Laravel Collections.
I don't know if anyone is going to stumble into similar problem, I found a way around it as mentioned in the documentation
I still don't know if this is the perfect way of doing it, but it did the trick for me. I am just posting it such that it might help someone a lot of headache and time.
I would still love to hear other answers and comments on the alternative ways of doing it.
$sorted = $mostWatchedVideosThisWeek->sortByDesc(function ($stats, $key) {
return count($stats);
});
if you searching for usort(), Laravel https://laravel.com/docs/5.8/collections#method-sort work same like usort()
eg:
$full_sorted = $collection_data->sort(function($a ,$b) { //$a first element ,$b second element
if ((count($a) > count($b))) {
return -1;
}else{
return 1;
}
})->values();
Possibly an obvious one, but here it is:
After dd'ing a query result, I have:
$items = DB::table('my_table')->get(['id']);
dd($items);
Which results in:
Collection {#228 ▼
#items: array:1 [▼
0 => {#227 ▼
+"id": 2
}
]
}
Then, when I try to flatten it, it ignores me:
dd($items->flatten());
Resulting in:
Collection {#209 ▼
#items: array:1 [▼
0 => {#227 ▼
+"id": 2
}
]
}
Shouldn't I receive something like the flattened version of the collection?
How can I do it?
Thanks in advance.
You need to check it like
$flattened = $items->flatten();
dd($flattened->all());
// or dd($items->flatten()->all());
Source from official documentation.
If you want to fetch id and completely flatten then use
$items = DB::table('my_table')->pluck('id');
dd($items);
Here is the pluck link.
I have this code where I try to grab all auth user categories:
$cats = Auth::user()->cats()->lists('title','id');
and I want to add new data to $cats so I write:
$cats->push(['5','BMW']);
but I got:
Collection {#459 ▼
#items: array:2 [▼
9 => "asd"
10 => array:2 [▼
0 => "5"
1 => "BMW"
]
]
}
How I to change my code to get this result:
Collection {#459 ▼
#items: array:2 [▼
9 => "asd"
5 => "BMW"
]
}
So how I can add the array to this collection?
p.s. I need this format because I use select2 jquery plugin
You can use the collection like an array:
$cats[5] = 'BMW';
I have two Laravel collections. first collection $customer(It has 30 elements):
Collection {#2615 ▼
#items: array:31 [▼
0 => {#2610 ▼
+"allocated_date": "2016-12-01"
+"Customer": "44"
}
1 => {#2616 ▼
+"allocated_date": "2016-12-02"
+"Customer": "42"
}
And other one is $agent(It has 17 elements)
Collection {#2586 ▼
#items: array:16 [▼
0 => {#2585 ▼
+"agent_allocated_date": "2016-12-01"
+"Agent": "41"
}
1 => {#2587 ▼
+"agent_allocated_date": "2016-12-02"
+"Agent": "95"
}
I need the result like this (leftJoin allocated_date with agent_allocated_date). can not using merge or combine. because number of elements in both collections are different. help me to find the output
array:31 [▼
0 => {#2596 ▼
+"allocated_date": "2016-12-01"
+"Customer": "44"
+"agent_allocated_date": "2016-12-01"
+"Agent": "41"
}
You need to map over the customer and find the agent for that customer and merge the two collections:
$customer= $customer->map(function ($item, $key) {
$single_agent = $agent->where('agent_allocated_date',$item->agent_allocated_date);
return collect($item)->merge($single_agent);
});
The better approach to execute join query.
I have tested this join query. It's working. Try this one.
$data = DB::table('customer')->select('customer.allocated_date','customer.Customer','agent.agent_allocated_date','agent.Agent')->join('agent','agent.id','=','customer.id');
print_r($data);
I have the following Eloquent query in a Laravel 5.2 project:
$regsByCtryCollection = Organisation::join('countries_currencies', 'countries_currencies.id', '=', 'organisations.country_id')
->select(DB::raw('DISTINCT LCASE(countries_currencies.country_code) AS ctry, COUNT(organisations.id) AS val'))
->groupBy('ctry')
->get();
The raw query produces this output:
ctry val
at 1
au 5
br 1
The Eloquent call produces a collection of three rows (matching raw query output) like this:
Collection {#791 ▼
#items: array:3 [▼
0 => Organisation {#777 ▼
#table: "organisations"
#hidden: []
........
#attributes: array:2 [▶]
#original: array:2 [▼
"ctry" => "at"
"val" => 1
]
#relations: array:5 [▶]
........
}
1 => Organisation {#778 ▶}
2 => Organisation {#779 ▶}
]
}
I then pluck the values and format for Highmaps like this
$regsByCtry = $regsByCtryCollection->pluck('ctry', 'val')->map(function($country, $value) {
return [
"hc-key" => $country,
"value" => $value
];
})->values()->toJson();
And one of the values is dropped and I get this:
[
{"hc-key":"br","value":1},
{"hc-key":"au","value":5}
]
Why is the first entry getting dropped?
{"hc-key":"at","value":1}
I am using this same process with two other Eloquent queries and it works as expected, but just not on this collection.
Additionally, I also sum all the values in the array of objects like this:
$regsTotal = array_sum($regsByCtryCollection->pluck('val')->toArray());
And I get the correct value, including all three records summed:
$regsTotal = 7;
The issue is with pluck('ctry', 'val'). This will return val as key & ctry as value. In your query output at & br has same value 1. So one of it getting replaced by the other one.
Try pluck('val', 'ctry')->map(function($value, $country)
Reference