I am working on a Laravel 8 app with users and posts.
From all the entries in the posts
table, I need to make 2 lists of posts, depending on whether they are active or pending. The statuses come from a post_statuses
table, with columns id
and status
.
In the Post model I have:
class Post extends Model {
use HasFactory;
protected $fillable = [
'title',
'category_id',
'description',
'body'
'status'
];
}
In the controller:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Post;
class PostsController extends Controller {
public $page_title = "Posts";
public function index(Request $request) {
$viewData = $this->loadViewData();
$viewData['page_title'] = $this->page_title;
$viewData['posts'] = $this->posts($request);
// send active posts to the view
return view('active_posts', $viewData);
}
public function posts(Request $request) {
$query = $request->input('query');
return Post::select (
"posts.title",
"posts.description",
"posts.body",
"categories.name as category_name",
"post_statuses.status as post_status",
)
->leftJoin("categories", "posts.category_id", "=", "categories.id")
->leftJoin("post_statuses", "posts.status", "=", "post_statuses.id")
// filter by status
->where('post_statuses.status', '=', 'active')
->orWhere('title', 'like', '%' . $query . '%')
->orWhere('description', 'like', '%' . $query . '%')
->orWhere('body', 'like', '%' . $query . '%')
->orWhere('categories.name', 'like', '%' . $query . '%')
->orWhere('post_statuses.status', 'like', '%' . $query . '%')
->orderBy('posts.id','DESC')
->paginate(10);
}
}
In the active_posts
view, all the posts are displayed, regardless of their status.
below is the updated code that you can use to get the active courses.
public function posts(Request $request) {
$query = $request->input('query');
return Post::select (
"posts.title",
"posts.description",
"posts.body",
"categories.name as category_name",
"post_statuses.status as post_status",
)
->leftJoin("categories", "posts.category_id", "=", "categories.id")
->leftJoin("post_statuses", "posts.status", "=", "post_statuses.id")
// filter by status
->where('post_statuses.status', '=', 'active')
->where(function($Query) use($query){
return $Query->where('title', 'like', '%' . $query . '%')
->orWhere('description', 'like', '%' . $query . '%')
->orWhere('body', 'like', '%' . $query . '%')
->orWhere('categories.name', 'like', '%' . $query . '%')
->orWhere('post_statuses.status', 'like', '%' . $query . '%');
})
->orderBy('posts.id','DESC')
->paginate(10);
}
Problem: The problem is you were doing the OR operation of status and $query value. Solution: You have to perform the AND operation between the status and the $query value. The closure takes care of OR operation for searching purposes.
Sign in to participate in this thread!
The Laravel portal for problem solving, knowledge sharing and community building.
The community