Im trying to convert a postgresql query to the laravel query builder style.
I have almost no experience with the laravel query builder. I dont want to use the DB raw.
SELECT ca1.component, ca1.previousfeeder, COUNT(ca1.previousfeeder)
FROM mydbcarrdata_10.carrier ca1
WHERE ca1.component IN (
SELECT e.articlename
FROM mydbcarrdata_10.carrier ca
JOIN mydbcompdata_10.component co
ON ca.component = co.name
JOIN mydbmanldata_10.entry e
ON e.articlename = co.name
JOIN mydbmanldata_10.header h
ON h.id = e.headerid
JOIN mydbmanldata_10.mandata m
ON h.layoutid = m.id
JOIN mydblytldata_10.layout l
ON m.layout = l.name
WHERE l.name = 'M2077F_bottom'
GROUP BY e.articlename
)
GROUP BY ca1.component, ca1.previousfeeder
ORDER BY ca1.component asc
Ive found the corresponding query using the query builder:
DB::table('mydbcarrdata_10.carrier')->select(DB::raw('component, previousfeeder, count(previousfeeder)'))
->whereIn('component', DB::table('mydbcarrdata_10.carrier')->select('articlename')
->join('mydbcompdata_10.component', 'component.name', '=', 'carrier.component')
->join('mydbmanldata_10.entry', 'component.name', '=', 'entry.articlename')
->join('mydbmanldata_10.header', 'entry.headerid', '=', 'header.id')
->join('mydbmanldata_10.mandata', 'mandata.id', '=', 'header.layoutid')
->join('mydblytldata_10.layout', 'layout.name', '=', 'mandata.layout')
->where('layout.name', '=', 'M2077F_bottom')
->groupBy('entry.articlename')
->pluck('articlename')
)
->groupBy('component', 'previousfeeder')
->orderBy('component', 'asc')
->get();
Related
I am new to Laravel and trying to support an existing application that is in Laravel 5. I am trying to convert the following SQL to eloquent structure
SELECT s.id,
CONCAT(u.first_name, ' ', u.last_name) AS user_name,
u.avatar_location AS user_img,
s.employee_photo,
d.name AS department,
seg.name AS segment,
s.survey_title,
s.before_action,
s.before_picture,
s.action,
s.action_date,
s.after_action,
s.after_picture,
s.nominated,
s.awarded,
s.created_at,
s.updated_at,
(SELECT COUNT(1) FROM likes l WHERE l.survey_id = s.id) AS likes,
(SELECT COUNT(1) FROM likes l WHERE l.survey_id = s.id AND l.user_id = 5) AS UserLikes,
(SELECT COUNT(1) FROM comments c WHERE c.survey_id = s.id ) AS comments
FROM surveys s
JOIN departments d
ON s.department = d.id
JOIN segments seg
ON s.segment_id = seg.id
JOIN users u
ON s.user_id = u.id
WHERE s.status = 'Approved'
ORDER BY s.action_date DESC
LIMIT 20 OFFSET 20
I know enough Laravel to know that my basic start would probably be
$surveys = DB::table('surveys')
->join('departments', 'surveys.department', '=', 'departments.id')
->join('segments', 'surveys.segment_id', '=', 'segments.id')
->join('users', 'surveys.user_id', '=', 'users.id')
->where('surveys.status', 'Approved')
->orderBy('surveys.action_date')
->skip(20)-take(20)
->select(...)->get();
However, I am not sure how to do the subqueries. Looking for any suggestions.
Thanks!
For select statements, you can use DB::raw().
$surveys = DB::table('surveys')
->join('departments', 'surveys.department', '=', 'departments.id')
->join('segments', 'surveys.segment_id', '=', 'segments.id')
->join('users', 'surveys.user_id', '=', 'users.id')
->where('surveys.status', 'Approved')
->orderBy('surveys.action_date')
->skip(20)-take(20)
->select([DB::raw('(SELECT COUNT(1) FROM likes l WHERE l.survey_id = s.id) AS likes'),
...
])
->get();
Similarly, select statements would go under the select array. Just so to be clear, the result will be a collection.
Im tried this to work it using Laravel Eloquent but i cant get exact query. So i make a raw query to get the data i want. Any one help me how to convert this into laravel eloquent or Query builder?
SELECT users.*,
chat.*
FROM users
LEFT JOIN
(SELECT a.customer_id,
a.time,
b.content
FROM
(SELECT customer_id,
MAX(datetimestamp) TIME
FROM chat_messages
GROUP BY customer_id) a
JOIN chat_messages b ON a.customer_id = b.customer_id
AND a.time = b.datetimestamp) chat ON users.id = chat.customer_id
WHERE users.customer_role != 0
ORDER BY TIME DESC
I think you are trying to get latest chat message for each user , your query can be rewritten using left join to pick the latest record per group and it would be easier to transform such query in laravel's query builder format
SQL
select u.*,c.*
from users u
join chat_messages c on u.id = c.customer_id
left join chat_messages c1 on c.customer_id = c1.customer_id and c.datetimestamp < c1.datetimestamp
where c1.customer_id is null
and u.customer_role != 0
order by c.datetimestamp desc
Query Builder
DB::table('users as u')
->select('u.*, c.*')
->join('chat_messages as c', 'u.id', '=', 'c.customer_id' )
->leftJoin('chat_messages as c1', function ($join) {
$join->on('c.customer_id', '=', 'c1.customer_id')
->whereRaw(DB::raw('c.datetimestamp < c1.datetimestamp'));
})
->whereNull('c1.customer_id')
->where('u.customer_role','!=',0)
->orderBy('c.datetimestamp', 'desc')
->get();
Reference:Laravel Eloquent select all rows with max created_at
This is my query from MySQL. I want to use 'LEFT JOIN' to two same tables with different aliases and having an 'ON' that has 'AND' inside its parenthesis. And this query arrives with the correct results, but my problem is how can I know the equivalent of this query to its Laravel query?
SELECT * FROM table1 AS a
LEFT JOIN table1 AS b
ON (a.column1 = b.column1 AND a.column2 < b.column2)
WHERE b.column2 is null;
And then I use this query in Laravel Query Builder which will query the wrong results.
DB::table('table1 As a')
->leftJoin('table1 As b', 'a.column1', '=', 'b.column1')
->leftJoin('table2 As c','a.column2', '<', 'c.column2')
->whereNull('c.column2')
->get();
This Laravel query is equivalent to this MySQL query which will, unfortunately, query the same wrong results:
SELECT * FROM table1 AS a
LEFT JOIN table1 AS b
ON (a.column1 = b.column1 AND )
LEFT JOIN table1 AS c
ON (a.column2 < c.column2)
WHERE b.column2 is null;
You need to pass a function to the leftJoin() Something like this...
DB::table('table1 as a')
->leftJoin('table1 as b', function($join) {
return $join->on('a.column1', '=', 'b.column1')
->whereColumn('a.column2', '<', 'b.column2');
})->get();
I want to join department d table with department dl table and user u table. I have done this in SQL query.
SELECT distinct(dl.head),
u.user_name,
u.id
from department d
inner join department dl on d.parent_department_string_id=dl.string_id
inner join users u on dl.head=u.user_name
where d.sl_flag=1
I want to do the same in Laravel query. Is it possible to join the same table using join in Laravel?
You can try something like this.
$departmentData = DB::table('department AS d')
->innerJoin('department AS d1', function($join) {
$join->on('d.parent_department_string_id', '=', 'd1.string_id');
})
->innerJoin('users AS u', function($userJoin) {
$userJoin->on('d1.head', '=', 'u.user_name');
})
->where('d.sl_flag', '=', 1)
->select(\DB::raw('distinct(dl.head) AS head'), 'u.user_name', 'u.id')
->get();
I have a sql query with joins is
select t.id,t.trip_id,c.containerid,s.shipment_name,s.source_location_name,s.destination_location_name,ss.status_name,st.status_name as status_type from
(select T.* from(SELECT * FROM tbl_trip_status ORDER BY id DESC) T group by T.trip_id) ts
JOIN tbl_trips t ON t.id=ts.trip_id
JOIN tbl_container c ON c.id=t.container_id
JOIN tbl_shipment s ON s.id=t.shipment_id
JOIN tbl_statuses ss ON ss.id=ts.status_id
JOIN tbl_status_types st ON st.id=ss.status_type
where t.status=1 and t.user_id in (1,2,3,4,5,6,14)
ORDER BY `t`.`trip_id` ASC
I need this query in eloquent mode while am trying to call paginate() with this raw query, it showing
call to membered function paginate() on array
Thanks to all
I found one solution in eloquent query,i.e.,
DB::table('tbl_trips as t')->select('t.id','t.trip_id','c.containerid','s.shipment_name','s.source_location_name','s.destination_location_name','ss.status_name','st.status_name as status_type')
->join(DB::raw('(select T.* from(SELECT * FROM tbl_trip_status ORDER BY id DESC) T group by T.trip_id) ts'),'ts.trip_id', '=', 't.id')
->join('tbl_container as c', 'c.id', '=', 't.container_id')
->join('tbl_shipment as s', 's.id', '=', 't.shipment_id')
->join('tbl_statuses as ss', 'ss.id', '=', 'ts.status_id')
->join('tbl_status_types as st', 'st.id', '=', 'ss.status_type')
->where('t.status','=',"1")
->where('t.id', '=', 'ts.trip_id')
->whereIn('t.user_id',$subusrs)
->paginate(10);
Thats all..
I think the issue is, after getting the data from your query, you have converted that Std Class Object to an array that's why the error you are getting.
Try this:
$data = DB::select(DB::raw('your query'));
here $data is an Std Class Object on which you can call the paginate functions.
Reference