【发布时间】:2017-08-12 08:14:35
【问题描述】:
我再次向社区寻求帮助... 场景:
我有两个表和一个数据透视表(类似于帖子和标签来提供一些上下文):
table 1 (Evento):
-id
-....
table 2 (Etiquetas):
-id
-etiqueta
pivot table (Eventos_Etiquetas):
-evento_id (pk)
-etiqueta_id (pk)
关系设置为:
public $belongsToMany = [
'eventos' => ['JML\Gkb\Models\Evento', 'table' => 'jml_gkb_eventos_etiquetas']
];
和
public $belongsToMany = [
'etiquetas' => ['JML\Gkb\Models\Etiqueta', 'table' => 'jml_gkb_eventos_etiquetas']
];
现在,我想要实现的目标:
- 获取具有任何单个标签的所有事件,而不考虑输入(或)的顺序。
-获取所有具有所有标签的事件,而不考虑输入(和)的顺序。
您可以想象我正在为此苦苦挣扎,因为我是十月/Laravel 查询构建器的新手(而不是 sql)。
到目前为止我做了什么:
if (Session::get('tipo') == 'etiqueta'){
$pesquisa = preg_split('/\s+/', $temp, -1, PREG_SPLIT_NO_EMPTY);
if (Session::get('modo') == 0){
$this['records'] = Evento::with('etiquetas')->whereHas('etiquetas', function($query) use ($pesquisa){
foreach ($pesquisa as $palavra){
$query->where('etiqueta', 'like', "%$palavra%");
}
})->orderBy('id', 'DESC')->paginate(25);
}
if (Session::get('modo') == 1){
$this['records'] = Evento::with('etiquetas')->whereHas('etiquetas', function($query) use ($pesquisa){
foreach ($pesquisa as $palavra){
$query->orWhere('etiqueta', 'like', "%$palavra%");
}
})->orderBy('id', 'DESC')->paginate(25);
}
}
用户输入由 $temp 变量传递,并被拆分为单词到 $pesquisa 数组变量。 'modo' 定义用户是否假装通过 AND (0) 或 OR (1) 进行搜索。基于该选择构建一个查询以尝试使用 $palavra 变量作为 $pesquisa 的任何单词来获取结果。
这个结果:
在 modo == 0 中,我只能获取用户输入的一个标签的事件,如果它有多个单词(第一个单词上不存在的任何字母),则不会得到任何结果。
在 modo == 1 中,它获取所有事件。
在这两种情况下,我都没有收到任何没有任何标签(礼仪)的事件——正确的行为。
我尝试了其他一些方法,但无济于事...在我看来,这是最合乎逻辑的尝试...有人可以指出正确的方向吗?
TIA
JL
【问题讨论】:
-
如果您收到“正确的行为”,那么问题是什么?
-
唯一能按预期工作的是所有没有任何“Etiqueta”的“Eventos”都被过滤掉了。剩下的(也是主要目标)情况没有得到预期的结果。泰
标签: laravel eloquent octobercms laravel-query-builder