Using IF Condition in Laravel Select Query with MySQL CASE WHEN

Apr 25, 2024 | MySql


Hello Dev,

In this tutorial, we'll explore how to integrate `if` conditions into Laravel's select queries. Leveraging MySQL's `CASE WHEN` statement with `DB::raw()` in Laravel allows us to incorporate MySQL functions. When utilizing MySQL functions, it's essential to employ the `DB::raw()` function. In this example, we'll illustrate a Laravel select query featuring an `if` condition.

There are instances in which employing an `if-else` condition in Laravel's Eloquent models is necessary, spanning versions 5 through 11. This functionality proves useful when you need to transfer data for imports or APIs, among other scenarios.

Let's consider a use case where a `status` field in the `users` table has the following meanings:

  • - 0: User
  • - 1: Admin
  • - 2: SuperAdmin

When querying this data, we want to display "User", "Admin", or "SuperAdmin" instead of the numeric values stored in the database. We can achieve this by crafting a MySQL query like so:

To use an IF condition in a Laravel select query, especially when you need to transform data based on certain conditions (like converting status codes into human-readable strings), you can leverage the DB::raw() method to include raw SQL expressions within your Eloquent queries. This approach is particularly useful when you're working with versions of Laravel from 5 to 11, as it allows you to integrate MySQL's CASE statement directly into your Laravel queries.

Example Scenario

Given your scenario where you have a users table with a status column that stores values 0, 1, or 2, representing "User", "Admin", and "SuperAdmin" respectively. You want to select all users but display their status as "User", "Admin", or "SuperAdmin" instead of the numeric values.

Read Also: MySQL Query for Data Between Two Dates Step 1: Constructing the Query

You can use the DB::raw() method to include a CASE statement within your Laravel Eloquent query. Here's how you can do it:

$users = User::select("*",
            \DB::raw('(CASE 
                WHEN users.status = "0" THEN "User" 
                WHEN users.status = "1" THEN "Admin" 
                ELSE "SuperAdmin" 
                END) AS status_lable'))
        ->get();
   
dd($users);
use Illuminate\Support\Facades\DB;

$users = DB::table('users')
    ->select(DB::raw("id, name, CASE
        WHEN status = 0 THEN 'User'
        WHEN status = 1 THEN 'Admin'
        WHEN status = 2 THEN 'SuperAdmin'
        ELSE 'Unknown'
    END as status"))
    ->get();

In this query:

DB::table('users') specifies the table you're querying.
select(DB::raw(...)) allows you to include raw SQL expressions in your query.
The CASE statement checks the value of the status column and returns a string representation ("User", "Admin", or "SuperAdmin") based on the value.
ELSE 'Unknown' is used as a fallback in case the status value doesn't match any of the specified cases.

Read Also: Adding 1 Day to a Timestamp in MySQL: A Step-by-Step Guide Step 2: Executing the Query

After constructing the query, you can execute it by calling the get() method, which retrieves the results as a collection of PHP objects.

Output

The output will be a collection of user objects, each with an id, name, and status property. The status property will contain the string representation ("User", "Admin", or "SuperAdmin") instead of the numeric value stored in the database.

Conclusion

Using DB::raw() with a CASE statement in Laravel allows you to perform conditional logic directly within your queries, making it easier to transform data as needed. This approach is particularly useful for scenarios where you need to display data in a more user-friendly format or when integrating with external systems that expect specific data formats.

Thank you for your encouragement! If you have any questions or need further assistance, feel free to ask. I'm here to help!



Tags :
#MySql
ItErrorSolution.com

ItErrorSolution.com

"Hey there! I'm a full-stack developer and proud owner of ItErrorSolution.com, based right here in India. I love nothing more than sharing handy tips and tricks with my fellow developers through easy-to-follow tutorials. When it comes to coding, I'm all about PHP, Laravel, Angular, Vue, Node, JavaScript, jQuery, CodeIgniter, and Bootstrap – been hooked on them forever! I'm all about putting in the work and staying committed. Ready to join me on this journey to coding?"