【问题标题】:Where to write search logic in laravellaravel 搜索逻辑在哪里写
【发布时间】:2016-09-09 07:27:02
【问题描述】:

我正在编写一个搜索脚本,并希望根据用户的查询返回结果。

以下是我的路线:-

Route::get('/search/{city}/{searchquery}', 'SearchController@search');

控制器

public function search($city, $query){
    strtolower($query);
    $commonWords = array('a','able','about','above','abroad'.....);
    $cleanQuery = preg_replace('/\b('.implode('|',$commonWords).')\b/','',$query);
    $cleanQuery = $s = preg_replace('/[^a-z0-9]+/i', ' ', $cleanQuery);
    $queryarray = explode(' ',$cleanQuery);
    $queryarray = array_filter( $queryarray );
    $queryarray = array_slice( $queryarray, 0 );



   //code to match each query word with MySQL fields such as title, description

    return $result;
}

我相信,所有这些逻辑和代码都不应该写在控制器中。我可以用什么来编写逻辑并使用控制器只返回结果

【问题讨论】:

  • 你可以将逻辑放在app/models中然后在控制器中调用public function search($city, $query);

标签: laravel model-view-controller laravel-5 controller


【解决方案1】:

最简单的方法是为此使用模型。只需编写一个获取关键字并将其解析为 sql 查询的方法。您可以使用范围方法来获得更大的灵活性。

public function scopeSearch($q, $keywords)
{
    // ... $keywords processing here
    $keywordsArray = explode(',', $keywords);

    return $query->whereIn('keyword', $keywordsArray);

    // OR maybe something like this?
    return $query->where('keywords', 'LIKE', '%'. $keywords .'%');
}

您可以在这样的控制器中使用此方法:

$city = new City();
$results = $city->search($keywords)->where(/* additional conditions could be added here */)->get();

即使您决定不使用范围方法,我仍然建议您返回查询构建器对象而不是集合,以提供更好的灵活性,例如在需要时在控制器中实现分页或其他操作。

如果您不害怕添加更复杂的内容以获得更大的灵活性,您也可以使用存储库。更多信息在这里:https://laracasts.com/lessons/repositories-simplified

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2012-11-12
    • 2018-06-14
    • 2017-04-19
    • 1970-01-01
    • 2011-04-05
    • 2014-03-16
    相关资源
    最近更新 更多