简体   繁体   中英

Laravel query not working properly

I do have simple query working properly but I want it working properly using ORM.

I have the following SQL query:

SELECT career_solutions.*, 
   users.username, 
   users.profile_picture 
FROM   career_solutions 
   INNER JOIN users 
           ON users.id = career_solutions.user_id 
   INNER JOIN privacy_settings 
           ON privacy_settings.user_id = users.id 
WHERE  career_solutions.topic_category_id = $categoryid 
   AND ( ( privacy_settings.career_solutions = 0 
           AND public = 1 ) 
          OR (( users.id IN (SELECT contacts.contact_id 
                             FROM   contacts 
                             WHERE  contacts.user_id = $id) 
                 OR users.id = $id )) ) 
ORDER  BY date DESC 
LIMIT  5000 

I'm passing the query directly to to the select method of the DB Facade like so: DB::select($aboveQuery); and it's working fine.

I am trying to do same using Laravel Eloquent. By using the following code I am not getting same result as above. Something is wrong with the below query.

$career_solution = CareerSolution::with('user.role', 'user.privancy_setting', 'category', 'sub_category', 'country');

$career_solution = $career_solution->where(function ($query) {
    $query->where('expires_at', '>=', date('Y-m-d'))
        ->orWhere('expires_at', '=', '0000-00-00');
});

$career_solution = $career_solution->Where(function ($query1) use ($id) {
    $query1->Where(function ($query2) use ($id) {
        $query2->whereHas('user.privancy_setting', function ($query3) {
            $query3->where('privacy_settings.career_solutions', '=', 0);
        })->where('public', '=', 1);
    })->orWhere(function ($query4) use ($id) {
        $query4->whereHas('user.contact', function ($query5) use ($id) {
            $query5->where('contacts.user_id', '=', $id);
        })->orWhere('user_id', '=', $id);
    });
});

It is not showing same result as above, let me know how I make it same as above.

The where condition are not used correctly, could you try this:

$career_solution = CareerSolution::with('user.role', 'user.privancy_setting', 'category', 'sub_category', 'country');

$career_solution = $career_solution->where(function ($query) {
    $query->where('expires_at', '>=', date('Y-m-d'))
        ->orWhere('expires_at', '=', '0000-00-00');
});

$career_solution = $career_solution->where(function ($query1) use ($id) {
    $query1->where(function ($query2) use ($id) {
                        // assuming that the relation name in User model is name public function privacy_setting ..
        $query2->whereHas('user.privacy_setting', function ($query3) {
            $query3->where('career_solutions', '=', 0); // You don't need to specify the table here only the table field you want
        })->where('public', '=', 1);
    })->orWhere(function ($query4) use ($id) {
                        // idem here the relation must be name contact
        $query4->whereHas('user.contact', function ($query5) use ($id) {
            $query5->where('user_id', '=', $id); // idem here
        })->orWhere('user_id', '=', $id);
    });
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM