JOIN after WHERE clause in laravel - mysql

I am performing a query in which desirable output is first apply where clause then after I want to perform right join.I have this query but it perform first join then where.thank you for you any help advance.
Here is my query
$friends = friend_list::where('friend_lists.user_id', '=', $id)
->rightJoin('users as u1', 'u1.id', '=', 'friend_lists.user_id2')
->where('friend_lists.user_id2','!=',$id)
->where('u1.id','!=',$id)
->orwhere('status',null)
->get();
edited:
I am implementing friend request section.
In which user table contains...user(id,name,..,..) friend_list(userid,userid2,status)
in friend_list shows status with other friend.I do right join withfriend_list.if status is null then there is no row for that user with current user.so status is null and it shows add friend
.so null value is important therefor right join with user table

Change the WHERE to another JOIN condition
$friends = friend_list::rightJoin('users as u1', function($join) {
$join->on('u1.id', '=', 'friend_lists.user_id2')
->where('friend_lists.user_id', '=', $id);
})
->where('friend_lists.user_id2','!=',$id)
->where('u1.id','!=',$id)
->orwhere('status',null)
->get();

Related

Join with inverse of second table in MySQl and Laravel

I have multiple tables for generating a report.
I join all of tables in a query and finally I group them to get a unique shop ids.
My problem is I want to get the last record of image table but when I join it I always get the first image record.
when I use orderBy at the end of query, the joined records ordered and images records orders isn't changed.
How can I reverse image table before joining with shop table to get the last image record?
$result = DB::table('shops')
->leftjoin('addresses', 'addresses.model_id', '=', 'shops.id')
->leftjoin('users', 'users.id', '=', 'shops.user_id')
->leftjoin('states', 'addresses.state_id', '=', 'states.id')
->leftjoin('cities', 'addresses.city_id', '=', 'cities.id')
->leftjoin('images', 'shops.id', '=', 'images.imageable_id')
->leftjoin('reviews', 'shops.id', '=', 'reviews.shop_id')
->select(['shops.name as shopName', 'images.name as image',
])
->groupBy(['shops.id'])
->where('shops.user_id', $id)->get();

select a specfic column from a inner joined table in laravel

I need all columns from invoice,invoice_details table but I want to get only one column (column name: amount) from my payment table. What will be my query for it? here is my controller.
$all_invoice = DB::table('invoice')
->join('invoice_details', 'invoice.invoice_id', '=', 'invoice_details.invoice_id')
->join('payment', 'invoice.invoice_id', '=', 'payment.invoice_id')
->where('invoice.client_id', 7)
->orderBy('invoice.invoice_id', 'DESC')
->get();
This very simple you need to add select clause in query like this.
$all_invoice = DB::table('invoice')->select(['invoice.*', 'payment.amount'])
->join('invoice_details','invoice.invoice_id','=','invoice_details.invoice_id')
->join('payment','invoice.invoice_id','=','payment.invoice_id')->where('invoice.client_id',7)->orderBy('invoice.invoice_id','DESC')->get();
If have still query the see the laravel docs in select option in query.
Just using select
$all_invoice = DB::table('invoice')
->join('invoice_details', 'invoice.invoice_id','=','invoice_details.invoice_id')
->join('payment', 'invoice.invoice_id', '=', 'payment.invoice_id')
->where('invoice.client_id', 7)
->select('payment.amount')
->orderBy('invoice.invoice_id', 'DESC')
->get();

Laravel DB query builder left join with related counts

I am new in Laravel and facing an issue with the DB query builder.
I want to fetch all the records from users table and want to count related wishlists in wishlists table. Here is my query.
select `users`.*, count(wishlists.id) as wishlists_count from `users` left join `wishlists` on `users`.`id` = `wishlists`.`uid` where `users`.`status` = 1 group by `wishlists`.`id`
I want to do it with laravel query builder. Here is what I am trying.
$leads = DB::table('users')
->selectRaw('users.*', 'count(wishlists.id) as wishlists_count')
->leftJoin('wishlists', 'users.id', '=', 'wishlists.uid')
->where('users.status',1)
->groupBy('wishlists.id')
->get();
It is showing this error.
Argument 2 passed to Illuminate\Database\Query\Builder::selectRaw()
must be of the type array, string given.
Any help will be greatly appreciated.
Thanks in Advance.
This should work. From the documentation, the second argument to selectRaw() is an optional array of bindings.
However, you can achieve what you are looking for with a combination of select() and DB::raw()
$leads = DB::table('users')
->select('users.*', DB::raw('count(wishlists.id) as wishlists_count'))
->leftJoin('wishlists', 'users.id', '=', 'wishlists.uid')
->where('users.status',1)
->groupBy('wishlists.uid')
->get();
Edit: The above answer is wrong. I would consider the following alternatives instead.
Either you could achieve it with a Sub-Query with something like the following:
$wishlist = Wishlist::select(DB::raw('count(wishlists.id)'))
->whereColumn('uid', 'users.id')
->getQuery();
$users = User::select('users.*')
->selectSub($wishlist, 'wishlists_count')
->get();
Or with a much easier way (assuming you have a wishlists relationship set up)
Users::withCount('wishlists')->get();
foreach($users as $user) {
echo $user->wishlists_count;
}

laravel multiple join conditions with integer values

I want to make a join with multiple conditions:
->join('filters', function($join) {
$join->on('filters.result_id', '=', 'results.id');
$join->on('filters.result_filter_id', '=', 2);
$join->on('filters.value', '>', 1);
})
This results in an error:
Unknown column '2' in 'on clause'
How can I use actual values in the join on condition without having eloquent interpret it as a column name? It works fine with the actual SQL query:
JOIN filters ON filters.result_id = results.id
AND filters.result_filter_id = 2
AND filters.value > 1
Replace on with where if you want to filter your join
If you would like to use a "where" style clause on your joins, you may use the where and orWhere methods on a join
->join('filters', function($join) {
$join->on('filters.result_id', '=', 'results.id')
->where('filters.result_filter_id', '=', 2)
->where('filters.value', '>', 1);
})
Documentation

Laravel query help needed

I have a question about Laravel queries, so I have a upload Model and database table which stores all my images. Then there is an Activity Model and database table which stores all my activities. For each activity I want a image.
So my Activity model has a 'uploads_id' column. I wrote the query like this:
$activity_images = DB::table('uploads')
->join('activities', 'uploads.id', '=', 'activities.upload_id')
->where('uploads.id', '=', 'activities.upload_id')
->get();
It cannot find the right image what am I doing wrong?
You are "joining" twice in your join and where clause. You connect uploads.id and activities.upload_id one time in the join and again in the where clause.
If you want to query for a special upload.id, your query should look like this:
$activity_images = DB::table('uploads')
->join('activities', 'uploads.id', '=', 'activities.upload_id')
->where('uploads.id', '=', '<yourUploadID>')
->get();
If you want all images, you can delete the where statement.
$activity_images = DB::table('uploads')
->join('activities', 'uploads.id', '=', 'activities.upload_id')
->get();
If you use join an inner join will be used.
You could also use leftJoin if you want all entries from the table uploads.
$activity_images = DB::table('uploads')
->leftJoin('activities', 'uploads.id', '=', 'activities.upload_id')
->get();
Does it solve your issue?