I have a query that gets all the message between two id (user_id and to_user_id). I want to select all the query all the message of user in the two tables.
I have already made two where and it doesn't seem to work. It is just returning null.
$last_message = DB::table('messages')
->select('content')
->where('user_id','=',Auth::user()->id)
->where('to_user_id','=',Auth::user()->id)
->orderBy('updated_at', 'desc')
->first();
I expect the output of all the message of user
You should check on this Auth::user()->id,
to see if it has a value or not. Also check on the datatype between table field and data source in query builder.
Related
I have two tables users/invoices in 1:n relation. When someone creats an invoice it saves the user_id. Also it's possible (optional) to set a manager (column: project_management_user_id). If there is no manager set (NULL), I want to get the user, who created the record. So for now I have this query. It gives me all invoices with the manager (but not that ones with manager = null.
$query = Invoice::join('users', 'invoices.project_management_user_id', '=', 'users.id')
->select('users.name as name', 'users.color as color', DB::raw("count(invoices.id) as count"))
->get();
Is it possible to add some if-clause like "if project_management_user_id is null, take the user_id"? I read about the whereNull() function, but it filters my whole query
Use leftJoin instead of join in the query.
I can select country and groupBy the result as following with an alias total :
Data::select('country', DB::raw('count(*) as total'))
->groupBy('country')
->get();
The above code works well.
Here I can select only country filed, But I need to select aslo name, positions field, How can I select multiple field here?
You have to use like below settings and change code.
Open config/database.php
Find strict key inside mysql connection settings
Set the value to false
Use code below like
ModelName::groupBy('country')
->selectRaw('count(*) as total, country, name, positions')
->get()
First, you need to specify what error/exception you're getting but you can add additional column by doing
DB::table('table_name')->select([DB::raw('count(*) as total'), 'name', 'positions', 'country'])
->groupBy('country')
->get());
it is also likely you get an access violation exception which requires you to change sql_mode
I am trying to get all articles which have 'approved' value in status column. Here is the code:
$articles = Article::where('status', 'approved')->orderBy('published_at', 'desc')->get();
But I am getting all data. where clause is not working! Is there anything wrong with the Syntax?
Edit 1:
Here is the what I'm getting for the query:
Edit 2:
Here are the columns I used in table.
I'm using Laravel Query Builder to get the last updated record from the database. However, it displays a different id with a different update_date. The update_date is correct, and it shows me last updated_date, but every time I'm getting the first id.
$results = DB::table('customer_info as cust_info')
->join('client_emp as client_info', 'cust_info.id', '=', 'client_info.cust_id')
->select('cust_info.id', DB::raw('MAX(cust_info.updated_at)'))
->orderBy('cust_info.id','DESC')
->first();
In the above query, I write select to get the id of last updated record.
->select('cust_info.id', DB::raw('MAX(cust_info.updated_at)'))
However, it shows me the last updated_date only with the first id from the table every time.
Try this:
orderBy('updated_at','DESC')->first()->id
Here you are getting the id of the latest updated record. When you remove the first() method, you will get the whole collection sorted by 'updated_at'
I have a model User that has many Orders. Orders have many products, with the pivot table order-product. I don't want to preload and iterate through the orders if at all possible.
I need to return users where
signed_date === true on User
order_date on Order is after signed_date on User
order-product shows product hasn't been paid
I am failing on number 2.
In the following code, the first query within whereHas is wrong. I don't know how to reference the signed date of the user from within the where has. If I was iterating through users in a collection I could do something like ($query) use $user, but how do I do this without preloading all the users?
return User::whereNotNull('signed_date')
->whereHas('orders', function ($query) {
$query->where('order_date', '<=', 'user.signed_date');
$query->whereHas('products', function ($q) {
$q->where('paid', false);
});
})
->get(['id','fname','lname', 'title', 'signed_date']);
I would like to use eloquent if possible. If that is not possible, I would be happy for tips in solving this problem using the query builder/sql.
The Eloquent query builder has a special function called whereColumn('a', '<=', 'b') to compare columns instead of a column against a value. Using this function instead of a normal where() is necessary because of the way the query builder builds the actual query. You need to let the query builder know that you are going to pass a column name instead of a value for proper escaping and formatting of the query string.
Anyway, it seems you can also pass column names prefixed with a table name to the function, allowing you to compare columns across tables:
$query->whereColumn('orders.order_date', '<=', 'users.signed_date')
This works because you are using whereHas() in your query. Your query basically gets translated to:
SELECT id, fname, lname, title, signed_date
FROM users
WHERE signed_date NOT NULL
AND EXISTS (
SELECT 1
FROM orders
WHERE orders.order_date <= users.signed_date
AND EXISTS (
SELECT 1
FROM products
WHERE paid = 0
)
)
It might actually be not necessary at all to use the table name together with the column name in whereColumn(). But in case you'll ever add a column named the same on another table, the query might break - so IMHO it is good practice to use the table name in custom queries.
By the way, the reason this will not work together with with('relationship') is that this function results in an additional query and you obviously cannot compare columns across queries. Imagine the following:
Order::with('user')->take(5)->get();
It will be translated into the following:
SELECT *
FROM orders
LIMIT 5
SELECT *
FROM users
WHERE id IN (?, ?, ?, ?, ?)
where the five ? will be the user_ids of the orders. If the first query returns multiple rows with the same user_id, the amount of rows fetched from the users table gets reduced of course.
Note: All the queries are only examples. Might be that the query builder builds different queries based on the database type and/or escapes them differently (i.e. column names in backticks).