Laravel通过关系进行搜索

时间:2017-09-28 03:03:15

标签: php laravel-5.3 laravel-eloquent

直截了当地说到这里。 我的项目列表中有搜索功能。但是,我也想按类别搜索所有项目。

这是我到目前为止所做的事情。 我真的很喜欢laravel和eloquent所以请耐心等待。

类别表

public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string('code', 30);
        $table->string('name');
        $table->softDeletes();
        $table->timestamps();
    });
}

项目表

public function up()
{
    Schema::create('items', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('category_id')->unsigned();
        $table->string('code', 30);
        $table->string('name');
        $table->softDeletes();
        $table->timestamps();
    });

    Schema::table('items', function($table){
        $table->foreign('category_id')->references('id')->on('categories');
    });
}

这是我的代码:

public function search(){
    $q = Input::get ( 'q' );
    if($q != ""){
        $items = Item::with('Category')
                    ->where ( 'name', 'LIKE', '%' . $q . '%' ) 
                    ->orWhere ( 'code', 'LIKE', '%' . $q . '%' )
                    ->whereHas('Category', function($cat){
                        $cat->where('name', 'hardware');
                    })->paginate(1)->setPath('');

        $items = $items->appends ( array (
                    'q' => Input::get ( 'q' ) 
            ) );
    }else{
        $items = Item::orderBy('id', 'desc')->paginate(10);
    }

    $softDeletesItems = Item::onlyTrashed()->get();
    return view('item.index', compact('items', 'softDeletesItems'));
}

有没有办法让我做orWHere('category.name', 'LIKE', '%'. $q .'%')

2 个答案:

答案 0 :(得分:1)

->whereHas('Category', function($query) use($q){

                       $query->where('name', 'LIKE', '%'. $q .'%')

         })->paginate(1)->setPath('');

答案 1 :(得分:1)

这就是我为实现它所做的一切。

    $items = Item
            ::join('categories', 'items.category_id', '=', 'categories.id')
            ->where ( 'items.name', 'LIKE', '%' . $q . '%' ) 
            ->orWhere ( 'items.code', 'LIKE', '%' . $q . '%' )
            ->orWhere('categories.name', 'LIKE', '%' . $q . '%')
            ->select('*')
            ->paginate(1)->setPath('');