代码之家  ›  专栏  ›  技术社区  ›  Razvan Zamfir

如何使用Laravel的查询生成器按状态筛选帖子?

  •  0
  • Razvan Zamfir  · 技术社区  · 3 年前

    我正在开发一款有用户和帖子的Laravel 8应用程序。

    posts 表中,我需要列出两个帖子列表,这取决于它们是否 忙碌的 悬而未决的 .状态来自 post_statuses 表,带列 id status .

    在Post模型中,我有:

    class Post extends Model {
        use HasFactory;
        
        protected $fillable = [
            'title',
            'category_id',
            'description',
            'body'
            'status'
        ];
    }   
    

    在控制器中:

    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);
        }
    }
    

    问题

    active_posts 查看,所有帖子都会显示, 不管他们的身份如何 .

    我的错在哪里?
    1 回复  |  直到 3 年前
        1
  •  3
  •   Sona Khachatryan    3 年前

    我猜 orWhere 把你的问题搞砸了。

    试着这样做:

        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 ($q) use($query){
                    $q->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);
        }