【发布时间】: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