通过连接laravel中的两个表进行搜索



我正在从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中进行了测试。

最新更新