2016-04-14 43 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因为它而不起作用 –