Collection to associative array with specific keys [L5.2] - laravel

I have the next collection:
Collection {#356 ▼
#items: array:31 [▼
0 => {#359 ▼
+"id": 17
+"zone_id": 2
+"name_de": "Österreich"
+"name_en": "Austria"
+"name_iso": "AUSTRIA"
+"tld": "at"
+"iso3166": "AT"
+"phone": 43
+"vat_regex": "/^U[0-9]{8}$/"
+"shop_id": 17
+"country_id": 165
}
1 => {#360 ▼
+"id": 2
+"zone_id": 2
+"name_de": "Belgien"
+"name_en": "Belgium"
+"name_iso": "BELGIUM"
+"tld": "be"
+"iso3166": "BE"
+"phone": 32
+"vat_regex": "/^[01][0-9]{9}$/"
+"shop_id": 17
+"country_id": 25
}]
}
And I want to get the next result as associative array:
[
"AT" => "Austria",
"BE" => "Belgium"
]
I'm trying to do it using:
$keyed = $countries->map(function ($item) {
return [$item->iso3166 => $item->name_en];
});
But I'm getting:
Collection {#357 ▼
#items: array:31 [▼
0 => array:1 [▼
"AT" => "Austria"
]
1 => array:1 [▼
"BE" => "Belgium"
]
]
}
What I'm doing wrong or how can I achieve the associative array?
Note: I'm using Laravel 5.2 so mapWithKeys() Collection method is not implemented.

You want to use function ->pluck('name_en', 'iso3166').

Related

How can I sort and separate this Laravel Collection

How can I sort this Collection by the values? It is needed also to add another index before each item because this way it is not possible since two items will have the same index, in our case: "User1".
I need this Collection:
Collection {#254 ▼
#items: array:2 [▼
"User1" => Collection {#253 ▼
#items: array:1 [▼
3 => 12.0
]
}
"User2" => Collection {#255 ▼
#items: array:2 [▼
3 => 11.0
1 => 13.0
]
}
]
}
to be sorted by the last values, and be separated in other "items":
Collection {#254 ▼
#items: array:3 [▼
"User2" => Collection {#255 ▼
#items: array:2 [▼
1 => 13.0
]
}
"User1" => Collection {#253 ▼
#items: array:1 [▼
3 => 12.0
]
}
"User2" => Collection {#255 ▼
#items: array:2 [▼
3 => 11.0
]
}
]
}
I can convert it in an array and make an iteration, but maybe Laravel has a simpler way.
Just use the sortBy() method. And specify wich value you want to sort
Here you can find all information you need about the collection methods:
https://laravel.com/docs/5.7/collections#method-sort

How can i change key id in method class orm Laravel?

Maybe is not possible but i have in table answers for radio input with id of question and answer like id = 36 , answer = Yes. My code below get all answers
public function getAnswer() {
return $this->hasMany('App\Answer', 'user_id', 'id')
->with('question')
->whereHas('question.group', function($query) {
$query->where('name', 'simple_quesion');
});
}
and i have collection which is ok
#items: array:9 [▼
0 => getAnswer {#400 ▶}
1 => getAnswer {#401 ▶}
2 => getAnswer {#402 ▶}
but is any way to get keys and assign with this collection like
#items: array:9 [▼
35 => getAnswer {#400 ▶}
37 => getAnswer {#401 ▶}
42 => getAnswer {#402 ▶}
in this method public function getAnswer() ?
[UPDATE]
full collection
Collection {#396 ▼
#items: array:9 [▼
0 => getAnswer {#400 ▼
#fillable: array:3 [▶]
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:7 [▼
"id" => 18
"user_id" => 11
"answer_id" => 34
"answer" => "YES"
]
#original: array:7 [▶]
#changes: []
And i need key answer_id => 34
#items: array:9 [▼
34 => getAnswer {#400 ▼
Ok i am so stupid. This is so easy. In blade or controller i can use:
{{ dd($user->getAnswer->pluck('answer', 'answer_id')) }}
Try this:
In Answer model, add this:
public function question(){
return $this->belongsTo("App\Question"); //the column name of the question should be "question_id"
}
in Question model, do:
public function answers(){
return $this->hasMany("App\Answer");
}
And in your controller, where you want to get the question and its answers, you just do:
Question::with('answers')->all(); //assuming you want to get all the questions and their answers

What should I do search results page by elasticsearch use elasticquent

This is My code,
search some products by elasticsearch use a packagist elasticquent:
$query = [
"body" => [
"query" => [
"function_score" => [
"query" => [
"multi_match" => [
"query" => $keyword,
"analyzer"=>"standard",
"type" => "best_fields",
"fields" => [
0 => "name^5",
1 => "content^1",
],
"fuzziness" => "AUTO",
"prefix_length" => 2
],
],
"field_value_factor" => [
"field" => "popular",
"modifier" => "log1p",
"factor" => "0.1",
],
"boost_mode" => "sum",
"max_boost" => "1.5",
],
],
],
];
$products = Product::complexSearch($query)->paginate(3);
//paging
$products->setPath('');
dd($products);
the result in browser is:
ElasticquentPaginator {#795 ▼
#total: 290
#lastPage: 97
#items: Collection {#790 ▼
#items: array:10 [▼
0 => Product {#801 ▶}
1 => Product {#804 ▶}
2 => Product {#807 ▶}
3 => Product {#779 ▶}
4 => Product {#789 ▶}
5 => Product {#785 ▶}
6 => Product {#791 ▶}
7 => Product {#782 ▶}
8 => Product {#798 ▶}
9 => Product {#788 ▶}
]
}
#perPage: 3
#currentPage: 1
#path: ""
#query: []
#fragment: null
#pageName: "page"
+"hits": array:3 [▶]
}
the Result number only 10, but the total is 290,and the paginate(3) ,3 is not work,what should i do ?
thank you!
Elasticsearch search size defaults to 10 as you can see in https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-from-size.html.
You can ask for more results by setting the size parameter to the desired number. Note that from version 2.0 onwards, you cannot set the size to >= 10000. If you wish to retrieve all the results that match your query you will have to use the scroll API: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html.

Excel file to Html using Maatwebsite/Laravel-Excel

I just setting up Maatwebsite/Laravel-Excel plugin from here https://github.com/Maatwebsite/Laravel-Excel/. I want to read excel file and display data in Html table in a blade In laravel. I got datas by using following:
$content=Excel::load($file, function($reader) {
})->get();
when I echo $content; I have following ::
SheetCollection {#762 ▼
#title: ""
#items: array:3 [▼
0 => RowCollection {#623 ▼
#title: "Sheet1"
#items: array:4 [▼
0 => CellCollection {#693 ▼
#title: null
#items: array:2 [▼
"name" => "Abc"
"city" => "City1"
]
}
1 => CellCollection {#692 ▼
#title: null
#items: array:2 [▼
"name" => "Xyz"
"city" => "city2"
]
}
2 => CellCollection {#710 ▼
#title: null
#items: array:2 [▼
"name" => "Name2"
"city" => "city3"
]
}
3 => CellCollection {#709 ▼
#title: null
#items: array:2 [▼
"name" => "Name2"
"city" => "city3"
]
}
]
}
1 => RowCollection {#728 ▼
#title: "Sheet2"
#items: []
}
2 => RowCollection {#697 ▼
#title: "Sheet3"
#items: []
}
]
}
Those are data on my xlsx file . Now I want to render it on view blade . any Idea???? thanks
You can use the Laravel Collections methods to get data. Explore the methods but I think you can try something like this.
return $content->all();
or iterate each row and store them formated in your data to render it in a blade view using each.
$content->each(function($row){
// process here each row
});
I hope it can help you.

Laravel 5 Array to View

Can some please tell me how to display the results of this array in a view in Laravel 5?
RowCollection {#464 ▼
#title: "Worksheet"
#items: array:3 [▼
0 => CellCollection {#472 ▼
#title: null
#items: array:2 [▼
"name" => "Owen Kelley"
"age" => 29.0
]
}
1 => CellCollection {#473 ▼
#title: null
#items: array:2 [▼
"name" => "Jim Jackson"
"age" => 50.0
]
}
2 => CellCollection {#474 ▼
#title: null
#items: array:2 [▼
"name" => "Sally Anne"
"age" => 35.0
]
}
]
}
I have been struggling with this for ages!
Many thanks.
You should use foreach, example:
In controller/routes.php:
return view('yourviewname')->with('elephants', 'elephants')
In blade view:
#foreach($elephants as $elephant)
{{ $elephant->name }}
#endforeach

Resources