how select between tow number 1 and 3 in faker laravel? - laravel

I do not need 2 .I want just 1 or 3 in user_id because it is foreign key and have just 1 and 3 number
'user_id' => rand(1,3)->not(2),
'resnumber' => rand(1000000,5000000),
'price' => rand(500000,1000000),
'payment' => rand(0,1),
'created_at' =>$faker->dateTimeBetween('-7 months','now')

You could use randomElement()
'user_id' => $faker->randomElement([1, 3]),
https://github.com/fzaninotto/Faker#fakerproviderbase

Related

I am found this type of result where User_id and full_name print everytime. full_name print one time and related multiple data shows in a single array

$nearProviderdata = DB::table('users','category')
->leftJoin('service_provider_rating', 'users.id', '=', 'service_provider_rating.rating_receiver_user_id')
->leftJoin('service_provider_category', 'users.id', '=', 'service_provider_category.user_id')
->leftJoin('category', 'category.id', '=', 'service_provider_category.category_id')
->select('users.id as user_id','users.full_name','category.id as category_id','category.title')
->distinct()->get()->groupBy('user_id');
I am receiving the below response from the above code.
[0] => stdClass Object
(
[user_id] => 11
[full_name] => Jimmi Patel
[category_id] => 1
[title] => Painter
)
[1] => stdClass Object
(
[user_id] => 11
[full_name] => Jimmi Patel
[category_id] => 2
[title] => Home Cleaner
)
[2] => stdClass Object
(
[user_id] => 11
[full_name] => Jimmi Patel
[category_id] => 3
[title] => Electrician
)
I want the result something like as below
[0] => stdClass Object
(
[user_id] => 11
[full_name] => Jimmi Patel
['category'] => [ category_id => 1,title => Painter, category_id => 2, title => Home Cleaner, category_id => 3, title => Electrician]
)
It's laravel version 5.7. I have tried group by also to get the result but it is showing only 1 row and 1 category data. So i am using the subquery to get the data. Please let me know if i am doing something wrong in it.
I think you don't need to join that much with raw query
better use models for this purpose
Simplified example:
$nearProviderdata = User::with(
'categories',
'serviceProviderRating',
'serviceProviderCategory'
)->get();
You can also add select in subquery and map response

How to filter using eloquent using distinct?

Would like for some help. Currently I have a table with multiple records.
Columns have is : id, identifier, price
I would like to write a query which I'm able to get the unique identifier with the highest price only.
I would like the collection to be
[
[
'id' => 5,
'identifier' => 1001
'price' => 50
],
[
'id' => 7
'identifier' => 1002,
'price' => 35
]
]
the first array id is 5 because from the identifier 1001 the highest price is 50 and the id is 5 and second array id is 7 because identifier 1002 highest price is 35
$maxPrices = Model::select(DB::raw('max(price)'))
->groupBy('identifier')->get();
query result: [50, 35]
Model::select()->whereIn('price',$maxPrices)->orderBy('price', 'desc')->get()
query result
[
[
'id' => 5,
'identifier' => 1001
'price' => 50
],
[
'id' => 7
'identifier' => 1002,
'price' => 35
]
]
Use this to get all distinct identifiers with max price (edit table):
$products = DB::table('tbl_products')->groupBy('identifier')->get(['identifier', DB::raw('MAX(price) as price')]);
Hi guys found a better solution. Read on DB view table. This function will create a virtual table with the value wanted and in laravel you can create a model to reference that virtual table and do eloquent query on it.

how to sort data in Laravel Eloquent query, based on a specific field

I have this Eloquent query:
$events = Product::forCard()->latest()->take(setting('storefront_recent_products_section_total_products', 10))->get();
I want to sort this record in ascending order by start_event. I tried to do this, but I have some issues because data come from multiple tables.
Array
(
[0] => Array
(
[price] => Modules\Support\Money Object
(
[amount:Modules\Support\Money:private] =>
[currency:Modules\Support\Money:private] => USD
)
[special_price] =>
[selling_price] => Modules\Support\Money Object
(
[amount:Modules\Support\Money:private] =>
[currency:Modules\Support\Money:private] => USD
)
[special_price_start] =>
[special_price_end] =>
[options_count] => 0
[id] => 40
[slug] => -YvHm5m1m
[in_stock] => 1
[new_from] =>
[new_to] =>
[name] => Race4
[description] =>
[organizer] =>
[short_description] =>
[address] =>
[city] => vehari
[state] => pakistan
[zip_code] =>
[lat] =>
[lng] =>
[start_event] => 2020-01-13 00:00:00
[end_event] =>
[translations] => Array
(
[0] => Array
(
[id] => 33
[product_id] => 40
[locale] => en
[name] => Race4
[city] => vehari
[state] => pakistan
[start_event] => 2020-01-13 00:00:00
)
)
[files] => Array
(
)
)
You should be able to order is ascending something similiar to this:
$events = Product::forCard()->latest()
->take(setting('storefront_recent_products_section_total_products', 10))
->orderBy('start_event', 'asc');
Basically you can tell using the method orderBy() which column shall be used to order and the type of ordering, in this case ascending.
Laravel makes it easy and absolutely no brainer to sort data.
$events = Product::forCard()->latest()->take(setting('storefront_recent_products_section_total_products', 10))
->orderBy('start_event')->get();
Where start_event is the column you want t use in sorting.
There is a better approach, as the above code will automatically sort the returned data in an ascending order, but you can explicitly tell it what to do.
Just modify the last part of the code with:
orderBy('start_event', 'ASC')->get(); /** If you want Ascending OR; **/
orderBy('start_event', 'DESC')->get(); /** If you want Descending. **/

remove row from pivot table in laravel

I have tables (projects, roles, scopes, shifts, users) and a table (project_role_scope_shift_user) as pivot.
I want to delete specific row like:
[project_id = 1 , scope_id = 2 , ... ]
However, detach method doesn't work correctly.
$user->roles()->detach(role) !not working => removes all rows of that role
$user->roles()->detach(role, ['project_id' => $projectId, 'scope_id' => $scopeId, 'shift_id' => $shiftId]); => this does not work too, removes all rows of that role
Try this :
$user->roles()->wherePivot(['project_id' => $projectId, 'scope_id' => $scopeId, 'shift_id' => $shiftId])->detach();

Laravel eager loading returns all results when querying realtionship

I want to get products with a seri name contains a certain word. However it returns all products. Matching serie name condition appears to be array under each related product; for the rest of products it is just a blank "serie" key.
$products=Product::with(array(
'serie'=>function($query)
{
$query->where('name','like','%unky%');
}))
->get()->toArray();
and array returned is like
[0] => Array
(
[id] => 1
[updated_at] => 2014-02-14 22:26:04
[created_at] => 0000-00-00 00:00:00
[brand_id] => 1
[cat_id] => 1
[serie_id] => 1
[devices_ids] => 1
[color_code] => #BEB991
[barcode] => 8699131462430
[title] => Funky Charlie iPhone 5/5S Kılıfı
[desc] => Sert 6 gr
[price] => 29.90
[serie] => Array
(
[id] => 1
[updated_at] => 2014-02-14 22:18:31
[created_at] => 0000-00-00 00:00:00
[name] => Funky
)
)
[1] => Array
(........
[5] => Array
(
[id] => 6
[updated_at] => 2014-02-14 22:46:10
[created_at] => 0000-00-00 00:00:00
[brand_id] => 1
[cat_id] => 1
[serie_id] => 2
[devices_ids] => 1
[color_code] => red
[barcode] => 8699131462546
[title] => Bonjour Kırmızı iPhone 5/5S Kılıfı
[desc] => Sert 6 gr
[price] => 24.90
[serie] =>
As you can see serie key is empty.
What i want is only to bring products with matching serie name and does not bring products like with id"5".
What i am doing wrong?
Thanks
I think that instead of using Model::with(), you want to instead filter the Model, based on the related model, so you should use Model::whereHas()
$products = Product::whereHas('serie', function($query)
{
$query->where('name','like','%unky%');
})->get()->toArray();
Eager loading constraints do not put a constraint on the results of the model - it constraints the related model. In your case, you get all Products. But if you try to access the Series of a Product, you will only get those Series that are true to your condition.
If you need to access the Series too and do not only need the Products, I would make the query like this:
$products=Product::with(array(
'serie'=>function($query)
{
$query->where('name','like','%unky%');
}))
->whereHas('serie', function($query) {
$query->where('name','like','%unky%');
})
->get()->toArray();
In this case, you get only the Products that are linked to a Serie whose name is like %unky% and you get only the related Series that hold to the same condition.
To sum this up: whereHas restricts the list of Products based on the condition, whereas the Eager Loading constraint restricts only the list of Series for each Product.

Resources