【问题标题】:Laravel - How to search based on tags in many-to-many polymorphic relation?Laravel - 如何基于多对多多态关系中的标签进行搜索?
【发布时间】:2014-07-24 07:37:05
【问题描述】:

我有一个设置了文本输入和多选输入的表单。多选输入有一个标签列表。标签被设置为多对多的多态关系。为了让事情更清楚,下面是我的表格和模型的概要:

表格:

org
   id - integer
   name - text
   ...

tags
   id - integer
   name - text

taggables
   tag_id - integer
   taggable_id - integer
   taggable_type - text

型号:

class Org extends Eloquent
{
    ...

    public function tags()
    {
        return $this->morphToMany('Tag', 'taggable');
    }
}


class Tag extends Eloquent
{
    ...

    public function org() 
    {
        return $this->morphedByMany('Org', 'taggable');
    }
}

在我的 routes.php 文件中,我正在尝试执行这样的搜索...

$search = Input::get('keyword');
$searchTerms = explode(' ', $search);
$query = Org::query();
$fields = array('name', 'description', 'additional_info', 'website');

foreach ($searchTerms as $term)
{
    foreach ($fields as $field)
    {
        $query->orWhere($field, 'LIKE', '%'. $term .'%');
    }
}

if(Input::get('tags'))
{
    $tags = Input::get('tags');
    $query
        ->join('taggables', 'taggables.taggable_id', '=', 'org.id')
        ->where('taggables.taggable_type', '=', 'Org')
        ->join('tags', 'taggables.tag_id', '=', 'tags.id')
        ->groupBy('org.id');

    foreach ($tags as $tag)
    {
        $query->orWhere('tags.id', '=', $tag);
    }
}

$org = $query->get();

但是,这当然行不通。关键字搜索工作正常,但我不确定如何添加一个只检索具有指定关联标签的行的查询。 $tags 变量是一个包含标签 ID 的数组。

我只想返回 org 表中至少有一个在数组中指定的标签的行。

更新: 我已经更新了我的代码,它有点工作,但它似乎返回标签而不是相关的组织——尽管我觉得我已经接近了。下面是我添加的相关代码(或者直接看上面):

$query
    ->join('taggables', 'taggables.taggable_id', '=', 'org.id')
    ->join('tags', 'taggables.tag_id', '=', 'tags.id')
    ->where('taggables.taggable_type', '=', 'Org')
    ->whereIn('tags.id', $tags);

更新 2: 这似乎按我的意愿工作,但由于某种原因,它检索标签的名称而不是组织名称......

$tags = Input::get('tags');
$query
    ->join('taggables', 'taggables.taggable_id', '=', 'org.id')
    ->where('taggables.taggable_type', '=', 'Org')
    ->join('tags', 'taggables.tag_id', '=', 'tags.id')
    ->groupBy('org.id');

foreach ($tags as $tag)
{
    $query->orWhere('tags.id', '=', $tag);
}

【问题讨论】:

    标签: php search laravel-4 eloquent query-builder


    【解决方案1】:

    我的关键字+标签搜索按以下方式工作:

    $query = Org::query();
    
    // Search by keyword(s)
    if(Input::get('keyword'))
    {
        $search = Input::get('keyword');
        $searchTerms = explode(' ', $search);
        $fields = array('org.name', 'org.description', 'org.additional_info', 'org.website');
    
        foreach ($searchTerms as $term)
        {
            foreach ($fields as $field)
            {
                $query->orWhere($field, 'LIKE', '%'. $term .'%');
            }
        }
    }
    
    // Search for tag(s)
    if(Input::get('tags'))
    {
        $tags = Input::get('tags');
        $query
            ->join('taggables', 'taggables.taggable_id', '=', 'org.id')
            ->where('taggables.taggable_type', '=', 'Org')
            ->whereIn('taggables.tag_id', $tags)
            ->groupBy('org.id')
            ->orderBy(DB::raw('count(*)'), 'desc')
            ->orderBy('name', 'asc');
    }
    
    $org = $query->get();
    

    如果为搜索输入了一个关键字和两个标签(例如),这将返回那些具有一个或多个标签的组织,包含与输入的关键字相似的词,并对结果进行排序,以便组织具有最匹配的标签将首先出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-30
      • 2015-10-29
      • 1970-01-01
      • 2021-10-18
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多