2016-04-14 41 views
1

今天,我正在嘗試升級我的搜索工具,目前我列出了所有可用的技能,並且一旦點擊它,就會搜索具有該技能的handymens。現在我想創建一個搜索框,以便一旦用戶輸入任何內容,一旦點擊按鈕,就會搜索並顯示所有這些技能。例如'p'會返回'Plumber'。但是我很努力,所以請幫助我,如果有其他文件或數據庫需要附加,請讓我知道。如何在laravel中創建搜索工具?

巧手數據庫:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateHandymenTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
public function up() 
{ 
    Schema::create('handymen', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('first_name'); 
     $table->string('last_name'); 
     $table->string('street'); 
     $table->string('postcode'); 
     $table->string('town'); 
     $table->string('skills'); 


     $table->integer('job_id')->unsigned(); 
     $table->foreign('job_id')->references('id')->on('jobs')->onDelete('cascade'); 


     $table->timestamps(); 
     }); 
    } 
/** 
* Reverse the migrations. 
* 
* @return void 
*/ 
public function down() 
{ 
    Schema::table('handymen', function (Blueprint $table) { 
     $table->dropForeign('handymen_job_id_foreign'); 
     $table->dropColumn('job_id'); 
    }); 
    } 
} 

技能表:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateSkillsTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('skills', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->string('skill'); 
      $table->timestamps(); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::drop('skills'); 
    } 
} 

結表:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateHandymanSkillTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('handyman_skill', function (Blueprint $table) { 
      $table->integer('handyman_id')->unsigned(); 
      $table->integer('skill_id')->unsigned(); 
      $table->timestamps(); 
     }); 
     Schema::table('handyman_skill', function ($table) { 
      $table->primary(['handyman_id', 'skill_id']); 
      $table->foreign('handyman_id')->references('id')->on('handymen')->onDelete('cascade'); 
      $table->foreign('skill_id')->references('id')->on('skills')->onDelete('cascade'); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::drop('handyman_skill'); 
    } 
} 

查看:

<h1>Here you can search</h1> 
    <form action="{{url('details')}}" method="POST"> 
    {{ csrf_field() }} 
     <div> 
      <input type='text' name='skill'/> 
     </div> 
    <input type="submit" name="submitBtn" value="Search"> 
    </form> 
    @foreach ($skills as $skill) 
     <p> 
      <a href="{{url('details/'.$skill->id)}}">{{$skill->skill}}</a>   
     </p> 

    @endforeach 
@endsection 

控制器:

function search() 
{ 
    $skills = Skill::all(); 
    return view('layouts/search',['skills' => $skills]); 
} 
function details($skillId) 
{ 
$skill = Skill::find($skillId); 
$handymen = $skill->handymen; 
$skill = Input::get('skill'); 
$result = Handyman::where('skills','LIKE','%'.$skill.'%') 
      ->orWhere('email','LIKE','%'.$skill.'%') 
      ->get(); 
return view('layouts/details', ['skill' => $skill,'handymen' => $handymen]); 
} 

回答

0

好 - 讓通過這一跑,我會給一些抽象的例子,讓你可以真正瞭解它是如何工作的 - 你靠近。

你能找到所有的勤雜工它通過像這樣有能力的用戶已經要求:

(假設用戶想要一個管道工,他們正在尋找管道進入搜索)

你將要使用Ajax來實現這一點,你在這裏提到:

所以例如'p'會返回'水管工'。

我打算假設這意味着你想返回所有具有管道技能的人手。第一

第一件事,查一些JavaScript這樣在你的搜索頁面:

function up() { 
    timer = setTimeout(function(){ 
      var keywords = $('#skills').val(); 
      if (keywords.length > 0) 
      { 
       $.post('/search/handymen', {keywords: keywords}, function(markup){ 
        $("#handymen").html(markup); 
       }); 
      } 
     }, 500); 
    } 
    function down() 
    { 
     clearTimeout(timer); 
    } 

標記:

{!! Form::open !!} 
<input type="text" name="searchHandymen" placeholder="Search and follow members" id="skills" onkeydown="down()" onkeyup="up()"> 
{!! Form::close() !!} 
<div id="handymen></div> 

這將有你的AJAX設立準備張貼到路徑/搜索/雜工。下面我會告訴你如何得到一個迴應&用你的結果更新頁面。一定要創建一個ROUTE來處理POST到/ search/handymen。

你返回能工巧匠應該是這樣的方法:

public function searchUsers(Request $request) 
{ 
    $keywords = $request->keywords; 

    $handymen = Handymen:whereHas('skills', function ($q) use($request) { 
      $q->where('name','LIKE','%'.$request->skill.'%'); 
     })->with('skills') 
     ->get(); 
    return view('searchedhandymen')->with('searchedhandymen', $handymen); 
} 

以上將限制你的eagarload,只能採取具有你發送通過技能的技能能工巧匠 - 你需要在您的技能表中添加一個名稱,該名稱僅代表技能的名稱,例如:id 1名稱管道。這會讓你在未來相信自己的頭痛。

在視圖searchhandymen內部,執行循環的結果($ handymen)並創建它,就好像它屬於頁面一樣,因爲AJAX請求將採用該視圖並將其直接注入到中。

請讓我知道,如果有什麼不清楚。我希望我幫你解決了一個問題,我不確定這是否是你發佈的問題。這會搜索你方便的人。

您可能需要在您的handymen模型btw上建立雄辯的關係。一對多的技能表就足夠了,是這樣的:

public function skills() 
{ 
return $this->hasMany(Skills::class, 'skill_id', 'handyman_id'; 
} 

上述不會滿足您確切的表設置,但它應該設置你在正確的軌道上。

讓我知道,如果我可以幫助了!謝謝!

+0

我從來沒有做過AJAX之前,所以想要得到更多的信息,如何做到這一點,一旦我在搜索框中鍵入的東西,並點擊進入我的鏈接得到的公共/搜索?searchHandymen =水管工。所以價值被收集,但是我得不到結果,在搜索工作者中循環看起來會是什麼樣子,因爲這是我所缺少的,並且probobly因爲它而不起作用 –