Laravel 5.2 - Update previous query - php

I have this query:
Sendqueue::select()
->where('userID', Session::get('uid'))
->where('campaign', $id)
->where('status', 'pending')
->update(array(
'status' => 'stopped',
));
The problem is that the amount of records it has to go through to do the update causes it to take around 15 minutes or so to finish.
I would like to split it up so the select and update queries are separate entities. Something sort of like this:
$pending = Sendqueue::select()
->where('userID', Session::get('uid'))
->where('campaign', $id)
->where('status', 'pending')
->get();
$pending->update(array(
'status' => 'stopped',
));
How would I go about doing this? Or is there an easier way?
Thanks!

I wasn't thinking, I figured out the answer. I had to run the second part in a foreach like so:
$records = Sendqueue::select()
->where('userID', Session::get('uid'))
->where('campaign', $id)
->where('status', 'pending')
->get();
foreach ($records as $record) {
DB::table('sendqueue')
->where('ID', $record->ID)
->update(['status' => 'stopped']);
}

protected $table="user";
public function updateUser($id,$username)
{
$resultData = array();
$updateArray = array('user_name'=>$username);
$update=DB::table('user')
->where('user_id', $id)
->update($updateArray);
return $resultData['status'] = true;
}

$my_id = preg_replace ('#[^0-9]#', '', $request->id);
if (! empty ($my_id)) {
$this->c->where ('id', $my_id )->update ( [
'first_name' => $request->get ( 'first_name' ),
'last_name' => $request->get ( 'last_name' ) ,
'phone' => $request->get ( 'phone' )
] );`enter code here`
\Session::flash ('message', 'Update Successful');
return redirect ('customer');
}
$this->edit ();
http://developer.e-power.com.kh/update-query-in-laravel-5-2/

Related

Laravel UPDATE query with multiple where conditions not working

I am fed up. Simple update method not working. It should update record matching the given item_id,restaurant_id and avil_date.
public function updateWeeklyItem(){
$item_id=request('item_id');
$restaurant_id=request('restaurant_id');
$avil_date=request('avil_date');
weekly_item::where(function($query) use ($item_id, $restaurant_id,$avil_date){
$query->where('item_id', $item_id)
->where('restaurant_id', $restaurant_id)
>where('avil_date', $avil_date);
})->update ([
'start_time'=>request('start_time'),
'end_time'=>request('end_time'),
'tiffin-switch'=>request('tiffin-switch'),
'lunch-switch'=>request('lunch-switch'),
'snacks-switch'=>request('snacks-switch'),
'dinner-switch'=>request('dinner-switch'),
'special-switch'=>request('special-switch'),
'extend-avil'=>request('extend-avil'),
'unit'=>request('unit'),
'quantity'=>request('quantity')
]);
}
Use This Code:
public function updateWeeklyItem(Request $request) {
$item_id = $request->item_id;
$restaurant_id = $request->restaurant_id;
$avil_date = $request->avil_date;
$item = weekly_item::where(function($query) use ($item_id, $restaurant_id,$avil_date) {
$query->where('item_id', $item_id)
->where('restaurant_id', $restaurant_id)
->where('avil_date', $avil_date);
})->first();
$item_array = (
'start_time' => $request->start_time,
'end_time' => $request->end_time,
'tiffin-switch' => $request->tiffin-switch,
'lunch-switch' => $request->lunch-switch,
'snacks-switch' => $request->snacks-switch,
'dinner-switch' => $request->dinner-switch,
'special-switch' => $request->special-switch,
'extend-avil' => $request->extend-avil,
'unit' => $request->unit,
'quantity' => $request->quantity
);
$item->update($item_array);
return $item;
}

Laravel multiple filter with search

I want to search service providers and products, and filter by location and by service, or by location and by-products. i am using below code` $results = new ClientProfile;
if (request()->has('service-provider')) {
$results = $results->where('jobsc_id', request('service-provider'));
} elseif(request()->has('product')) {
$results = $results->where('product_id', request('product'));
} elseif(request()->has('city')){
$results = $results->where('divsec_id', request('city'));
} else {
$results = ClientProfile::searched();
}
$results = $results->where('profile_state', 'active')->paginate(10)->appends([
'service-provider' => request('service-provider'),
'product' => request('product'),
'city' => request('city'),
]);
return view('results')->with('results', $results);`
although it shows URL as domain.com/results?product=2&city=78 it shows all products without filter by city
You use if elseif therefore it when finding one, in the second also does not come.
use when instead if else
$results = new ClientProfile::when(request()->has('service-provider'), function($q){
$q->where('jobsc_id', request('service-provider'));
})
->when(request()->has('product'), function($q){
$q->where('product_id', request('product'));
})
->when(request()->has('city'), function($q){
$q->where('divsec_id', request('city'));
})
->when(count($request->all()) === 0, function($q){
$q->searched();
})
->where('profile_state', 'active')->paginate(10)->appends([
'service-provider' => request('service-provider'),
'product' => request('product'),
'city' => request('city'),
]);
return view('results')->with('results', $results);`
This code worked for me
$results = ClientProfile::when(request()->has('service-provider'), function($q){
$q->where('jobsc_id', request('service-provider'));
})->when(request()->has('product'), function($q){
$q->where('product_id', request('product'));
})->when(request()->has('city'), function($q){
$q->where('divsec_id', request('city'));
})->when(count(request()->all()) === 0, function($q){
$q->searched();
})->where('profile_state', 'active')->paginate(10)->appends([
'service-provider' => request('service-provider'),
'product' => request('product'),
'city' => request('city'),
]);

Laravel Eloquent use the orWhere query in my search system request

I tried to code a request with search system. Here the code:
$search = request()->get('search');
if(Auth::user()->hasRole('admin') || true)
{
list($orderBy, $orderDirection) = explode('.', request()->get('sort_by'));
$prestations = Prestation::with(
'service:id,name',
'facility:id,name'
)
->orWhere('service:name', 'regexp', "/$search/i")
->orderBy($orderBy, $orderDirection)
->simplePaginate(50);
$res = [
'results' => $prestations,
'total' => Prestation::all()->count(),
];
return $res;
}
The problem is that I don't know how to do something like I tried with the orWhere -> get all service name (from the relationship "with") which are equal to my $search.
Thank you.
Try this query.
$prestations = Prestation::with(
[
'service' => function($service) use($search){
$service->select(['id','name'])->where('name', $search);
},
'facility' => function($facility) {
$facility->select(['id','name'])
}
]
);

How to see matches of search in SQL?

I have a search line where a user enters query divided by commas. I need to find at least 1 matches in the SQL-table. But I need to mark the matches in each found object too. How can I do this?
Working search (Laravel Eloquent (PostgreSQL) without marking matches):
public function searchOfAuthor(Request $request)
{
$search = array_map('trim', explode(',', $request->get('search')));
$columns = [
'city',
'phone',
'email',
'skype',
'icq',
'vk'
];
$authors = AuthorMask::where(function ($query) use ($columns, $search) {
foreach ($search as $searchKey) {
if (!empty($searchKey)) {
$query->orWhere('name', 'ILIKE', '%'.$searchKey.'%');
foreach ($columns as $column) {
$query->orWhere($column, 'ILIKE', $searchKey);
}
}
}
})
->with('author')
->orderByRaw('company_id = ? desc', Auth::user()->company_id)
->paginate(5);
if (empty($authors->items())) {
return response()->json([
'data' => null,
'error' => 'Authors Have Not Been Found'
], 404);
}
return response()->json([
'data' => [
'authors' => $authors
],
'error' => null
], 200);
}
Sorry for my English.
There are nothing condition like ILIKE in laravel or Mysql. There should be LIKE. There are two lines of codes have ILIKE.
$query->orWhere('name', 'ILIKE', '%'.$searchKey.'%');
$query->orWhere($column, 'ILIKE', $searchKey);
Remove I from ILIKE of above two lines. After removing I from ILIKE it should look like
$query->orWhere('name', 'LIKE', '%'.$searchKey.'%');
$query->orWhere($column, 'LIKE', $searchKey);
Did it. Just created new array for mark of matches. Another question: who know how to append array to the object in pagination?
$matches = [];
foreach ($authors->items() as $author) {
$matches[$author->id]['name'] = 0;
foreach ($columns as $column) {
$matches[$author->id][$column] = 0;
}
foreach ($search as $searchKey) {
if (!empty($searchKey)) {
foreach ($author->toArray() as $key => $attribute) {
if (!strcasecmp($searchKey, $attribute)) {
$matches[$author->id][$key] = 1;
}
}
}
}
}
return response()->json([
'data' => [
'authors' => $authors,
'matches' => $matches
],
'error' => null
], 200);

Eloquent calculate if I have more results left

I'm building a Products API. I need to return a collection of products and a variable telling me if I have more results starting from the last the answer has just returned me to show or hide a load more button. This is all I have until now:
$query = Product::query();
$query->where('category_id', $request->get('category_id'));
$query->orderBy('order', 'asc')
->orderBy('name', 'asc')
->skip($skip)
->take($take);
And this is how I return it:
return [
'products' => $query->get(['id', 'name', 'front_image', 'back_image', 'slug']),
'has_more' => ????
];
How can I calculate the has_more?
The easiest approach would be to query the database twice:
$query = Product::query()
->where('category_id', $request->get('category_id'))
->orderBy('order', 'asc')
->orderBy('name', 'asc');
$count = $query->count();
$hasMore = $skip + $take < $count;
$models = $query->skip($skip)
->take($take)
->get(['id', 'name', 'front_image', 'back_image', 'slug']);
return [
'products' => $models,
'has_more' => $hasMore
];
You can just get the count of the entire records and then simply do the check for has more like so:
<?php
$query = Product::query()
->where('category_id', $request->get('category_id'));
->orderBy('order', 'asc')
->orderBy('name', 'asc');
$count = $query->count();
return [
'products' => $query->skip($skip)
->take($take)
->get(['id', 'name', 'front_image', 'back_image', 'slug']),
'has_more' => ($hm = ($count - ($take + $skip))) > 0 ? $hm : false
];

Categories