我正在从jobs_table
成功搜索具有title
的作业。它具有id, title, city_id, created_at
。我有另一个名为cities
、具有id, name
的表。我只想添加这两个表,并按城市的name
进行搜索。
职位模型查询:
public static function scopeSearch($query, $searchTerm)
{
return $query->where('job_title', 'like', '%' .$searchTerm. '%');
}
控制器查询:
public function indexsearch(Request $request)
{
$searchTerm = $request->input('searchTerm');
$posts = Job::search($searchTerm)->orderBy('created_at', 'desc')->where('job_status', '0')->paginate(10);
return view('front.pages.job.jobresult', compact('posts', 'searchTerm'))->with(['title'=>'Result']);
}
刀片查询:
<form action="{{ route('job.jobresult') }}" method="GET" id="search-form_3" class="mb-4">
{{csrf_field()}}
<div class="input-group">
<input type="text" class="search_3" name="searchTerm" placeholder="Search for Jobs..." value="{{ isset($searchTerm) ? $searchTerm : '' }}">
<input type="submit" class="submit_3" value="Search" />
</div>
</form>
到目前为止,单表搜索一切都很好,现在我只想加入两个表,然后通过城市的name
进行搜索。
请帮帮我。提前感谢
工作模式:
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Job extends Model
{
protected $fillable = [
'job_title','city_id'
];
public static function scopeSearch($query, $searchTerm)
{
return $query->where('job_title', 'like', '%' .$searchTerm. '%');
}
}
城市模式:
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class City extends Model
{
protected $table = 'cities';
protected $fillable = [
'name'
];
}
我试过:
return $query->where('cities.city', 'LIKE', '%' . $searchTerm . '%')->join('cities', 'jobs.city', '=', 'cities.id');
它起作用,但我如何在其中添加其他字段。
根据您最近的编辑,假设city_id
是作业表上的列名称(而不是问题最后一行所示的city
(,以下内容应该可以满足您的要求:
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Job extends Model
{
protected $fillable = [
'job_title','city_id'
];
public static function scopeSearch($query, $searchTerm, $cityName)
{
return $query->where('job_title', 'like', '%' .$searchTerm. '%')
->join('cities', 'jobs.city_id', '=', 'cities.id')
->where('cities.name', 'like', '%' . $cityName . '%');
}
}
没有什么可以真正解释的;只需根据需要向作用域添加其他参数即可。
您已经找到了联接语法,因此如何添加其他数据的剩余答案是向查询生成器实例添加where子句,该子句具有联接表的名称,并为静态函数提供了一个额外的参数。
它的用途和你想象的一样简单:
// assuming $cityName is defined...
$posts = Job::search($searchTerm, $cityName)
->orderBy('created_at', 'desc')
->where('job_status', '0')
->paginate(10);
在Laravel 5.7、7和8中进行了测试。