Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel-如何基于多对多多态关系中的标记进行搜索?_Php_Search_Laravel 4_Eloquent_Query Builder - Fatal编程技术网

Php Laravel-如何基于多对多多态关系中的标记进行搜索?

Php Laravel-如何基于多对多多态关系中的标记进行搜索?,php,search,laravel-4,eloquent,query-builder,Php,Search,Laravel 4,Eloquent,Query Builder,我用文本输入和多选输入设置了一个表单。多选输入有一个标记列表。标记被设置为多对多多态关系。为了让事情更清楚,下面是我的表格和模型的概要: 表: org id - integer name - text ... tags id - integer name - text taggables tag_id - integer taggable_id - integer taggable_type - text 型号: class Org exte

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

表:

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表中至少有一个数组中指定的标记的行

更新: 我已经更新了我的代码,它可以正常工作了,但是它似乎返回了标签,而不是相关的组织——尽管我觉得我离它越来越近了。下面是我添加的相关代码(或者只看上面的代码):

更新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);
}

我通过以下方式实现了关键字+标记搜索:

$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();
如果为搜索输入了一个关键字和两个标记(例如),这将返回具有一个或多个标记、包含与输入的关键字相似的单词的组织,并对结果进行排序,以便首先显示具有最匹配标记的组织

$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();