How to save multiple array input data in Database in Laravel PHP - php

Hello Geeks i am stuck here. I am beginner and want to know how to save and update array data in database.
this is laravel form requested data
I want to save data like this :
mysql database
here is my form request, i want to save data in mysql database, with new row :
"_token" => "FoyoYvFXmNAggbQuMq6PN243QS43MkY99Nq3UAni"
"description" => array:2 [▼
0 => "<h3>Shared Hosting Plan</h3>"
1 => "<h3>Cloud Hosting Plan</h3>"
]
"site_id" => array:2 [▼
0 => "5361"
1 => "5361"
]
"category_id" => array:2 [▼
0 => "1"
1 => "3"
]
"field_1" => array:2 [▶]
"field_2" => array:2 [▶]
"field_3" => array:2 [▶]
"field_4" => array:2 [▶]
"field_5" => array:1 [▶]
"price" => array:2 [▶]
"update_plan" => "Save Plans"
]```

Try like this
$save_data=[];
foreach($data['description'] as $key=>$desc){
$save_data[]=[
'description'=>$desc,
'site_id'=>$data['site_id'][$key],
'category_id'=>$data['category_id'][$key],
'feature_field_1'=>$data['field_1'][$key],
'feature_field_2'=>$data['field_2'][$key],
'feature_field_3'=>$data['field_3'][$key],
'feature_field_4'=>$data['field_4'][$key],
'feature_field_5'=>$data['field_5'][$key],
'price'=>$data['price'][$key]
]
}
\DB::table('table')->insert($save_data);

You can insert like this
Eloquent approach
Model::insert($data);
Query Builder approach
DB::table('table')->insert($data);

Related

How to count the amount of keys in a multidimensional array

I have the following multidimensional array :
meeting[$loop->index][person]are checkboxes
meeting[$loop->index][date] are input-fields
array:9 [▼
0 => array:1 [▼
"date" => null
]
1 => array:2 [▼
"person" => "Max Example"
"date" => "10.05"
]
2 => array:1 [▼
"date" => null
]
3 => array:1 [▼
"date" => null
]
4 => array:1 [▼
"date" => null
]
5 => array:1 [▼
"date" => null
]
6 => array:1 [▼
"date" => null
]
7 => array:1 [▼
"date" => null
]
8 => array:1 [▼
"date" => null
]
]
person in this case is a checkbox, so it's only there when it's checked.
Now I want to know, how many persons are 'invited' to the meeting.
So I need to count the amount of person (check how often person exists).
When only one person is invited I want to display something else than when more people are invited.
I tried it with this:
#if ($counts = array_count_values(array_flip(array_column($ticketDaten['hefte'], 'heft'))) == 1)
[...]
but if I var_dump it I only get bool(false) in both cases (only one person or more).
You should be able to simply
echo count(array_column($meeting, 'person'));
Demo on 3v4l.org

Collection pluck by relation id and get count

I have Project and Country Model. There is a many to many relations. I get projects with countries. Result is below
array:5 [▼
0 => array:5 [▼
"id" => 2
"account_id" => 1
"start_date" => "Jul 2012"
"end_date" => "Aug 2013"
"countries" => array:1 [▼
0 => array:2 [▼
"id" => 148
"pivot" => array:2 [▶]
]
]
]
1 => array:5 [▶]
2 => array:5 [▶]
3 => array:5 [▶]
4 => array:5 [▶]
]
I wont to get all unique countries count. In the now I do it with this way
$projects->pluck('countries')->collapse()->pluck('id')->unique()->count()
Question. Can I use pluck with nested relation column and has any more shortly and good solution?? for example like this
$projects->pluck('countries.id')->count();
You can use this:
$projects->pluck('countries.*.id')->flatten()->unique()->count()
You can't use:
$projects->pluck('countries.id')...
Because countries is an array of arrays.
But you can use the 'countries.*.id' on those cases
Or the other way round...
Country::whereHas('projects', function ($query) {
// $query->where(); if you want to limit the projects
})->count();
You get unique countries since your fetching from the countries table
I find this solution
$projects->groupBy('countries.*.id')->count();

Laravel - How to collect multiple array to single one

I've created a collection like this :
Collection {#651 ▼
#items: array:3 [▼
0 => array:3 [▼
"orderId" => "402457"
"orderCreated" => DateTime {#656 ▶}
"foods" => array:2 [▶]
]
1 => array:3 [▼
"orderId" => "402457"
"orderCreated" => DateTime {#661 ▶}
"foods" => array:2 [▶]
]
2 => array:3 [▼
"orderId" => "402457"
"orderCreated" => DateTime {#665 ▶}
"foods" => array:2 [▶]
]
]
}
I demand to achieve collection like this (with Laravel collection):
Collection {#651 ▼
#items: array:3 [▼
0 => array:3 [▼
"orderId" => "402457"
"orderCreated" => DateTime {#656 ▶}
"foods" => array:6 [▶]
]
]
}
Because orderId and orderCreated are all the same in arrays. I need to make single array that collect orderId and orderCreated with all foods.
Any suggestion?
You can take the data from the first one and just combine all of the food items. For instance like this:
$new = collect([
'orderId' => $old->first()->orderId,
'orderCreated' => $old->first()->orderCreated,
'foods' => $old->pluck('foods')->flatten(1),
]);
The exact implementation will depend on how you built your initial collection.

array_search in php doesn't find my string

So I'm trying to make a function that searches a string in a whole array. But it give me anything... So my array looks like this :
array:1 [▼
"list" => array:2 [▼
"pagination" => array:5 [▶]
"entries" => array:11 [▼
0 => array:1 [▼
"entry" => array:8 [▼
"firstName" => "Doctor"
"lastName" => "Who"
"emailNotificationsEnabled" => true
"telephone" => "0123456789"
"company" => []
"id" => "DW"
"enabled" => true
"email" => "doctorwho#time.lord"
]
]
1 => array:1 [▶]
2 => array:1 [▶]
3 => array:1 [▶]
4 => array:1 [▶]
5 => array:1 [▶]
6 => array:1 [▶]
7 => array:1 [▶]
8 => array:1 [▶]
9 => array:1 [▶]
10 => array:1 [▶]
]
]
]
So for exemple at first I did $key = array_search("doctor", $users); but this gives me nothing. So I thought it was because I have a multidimensional array. So I reduced it to just one array (and I would search in the rest of the original array with a for loop), so now I'm working with this array that I got with $users['list']['entries'][0]
array:1 [▼
"entry" => array:8 [▼
"firstName" => "Doctor"
"lastName" => "Who"
"emailNotificationsEnabled" => true
"telephone" => "0123456789"
"company" => []
"id" => "DW"
"enabled" => true
"email" => "doctorwho#time.lord"
]
]
But $key = array_search("doctor", $users['list']['entries'][0]); still doesn't give me anything (but false).
Does anyone know where is my mistake ? Because I couldn't find a solution of my problem yet and it's been a pretty long time I'm on it... I'm still a beginner in php so maybe I've missed something obvious and i'm sorry if I did.
Thank you in advance !
you are searching for doctor,but value stored in your array is as Doctor. So either search for Doctor as
$key=array_search('Doctor', $users['list']['entries'][0]));
or for case in-sensetive search use
$key=array_search(strtolower('Doctor'), array_map('strtolower', $users['list']['entries'][0]));
Note: as your array is multidimensional, so use loop to search your value

saving multidimensional array as rows in mysql using laravel 5

i have a multidimensional array from a form that looks like this:
$items = array:8 [▼
"units" => array:4 [▼
0 => "1"
1 => "1"
2 => "1"
3 => "1"
]
"article_group" => array:4 [▼
0 => "2401"
1 => "2503"
2 => "1360"
3 => "1198"
]
"article" => array:4 [▶]
"description_en" => array:4 [▶]
"unit_price" => array:4 [▶]
"discount" => array:4 [▶]
"invoice" => array:4 [▶]
"delivery_note" => array:4 [▶]
]
The form is dynamically generated, and will not always contain 4 values, but they will always contain the same amount of values.
What i want to do is to save these records in a mysql database like this:
$bookingDetails = new bookingDetails;
$bookingDetails->units = units[0];
$bookingDetails->article_group = article_group[0];
$bookingDetails->article = article[0];
$bookingDetails->description_en = description_en[0];
$bookingDetails->unit_price = unit_price[0];
...
$bookingDetails->save();
and then the same thing with [1] and [2] and so on.
but how do i iterate through this in that way?
Regards Johan
Rather than hitting the database n number of times, in your case, count times, you can do the same in ONE HIT using bulk insert.
$your_data = array(
array('col_name_1'=>'Value 1', 'col_name_2'=>'Value 2'),
array('col_name_1'=>'Value 3', 'col_name_2'=>'Value 4')
);
your_model_name::insert($your_data);
This will improve the response time of your application.
Simply make a for or foreach loop as
for($i=0;$i<count($items['units']);$i++){
$bookingDetails->units = $items['units'][$i];
$bookingDetails->article_group = $items['article_group'][$i];
$bookingDetails->article = $items['article'][$i];
$bookingDetails->description_en = $items['description_en'][$i];
$bookingDetails->unit_price = $items['unit_price'][$i];
$bookingDetails->save();
}

Categories