十月CMS - 具有关系的模型查询 manyToMany.



我再次向社区寻求帮助... 场景:

我有两个表和一个数据透视表(类似于帖子和标签以提供一些上下文):

table 1 (Evento):
-id
-....
table 2 (Etiquetas):
-id
-etiqueta
pivot table (Eventos_Etiquetas):
-evento_id (pk)
-etiqueta_id (pk)

关系设置为:

public $belongsToMany = [
'eventos' => ['JMLGkbModelsEvento', 'table' => 'jml_gkb_eventos_etiquetas']
];

public $belongsToMany = [
'etiquetas' => ['JMLGkbModelsEtiqueta', 'table' => 'jml_gkb_eventos_etiquetas']
];

现在,我想要实现的目标:

-获取具有任何单个标记的所有事件,而不考虑输入顺序(OR)。

-获取具有所有标记的所有事件,而不考虑输入(和)的顺序。

正如您可以想象的那样,我正在努力解决这个问题,因为我是 October/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中,它获取所有事件。

在这两种情况下,我都不会收到任何没有任何标签(礼仪)的事件 - 正确的行为。

我已经尝试了其他一些方法,但无济于事...在我看来,这是最合乎逻辑的尝试......有人可以指出我正确的方向吗?

蒂亚

经过一些尝试,我已经解决了一半的问题。我想获得任何"Evento"的部分,该"Evento"在用户输入上具有任何"礼仪",而不考虑它们的顺序,终于可以正常工作。

简历波纹管

if (Session::get('tipo') == 'etiqueta'){
$pesquisa = preg_split('/s+/', $temp, -1, PREG_SPLIT_NO_EMPTY);
$cadeiapesquisa = implode('|', $pesquisa);
/***** NOT WORKING YET *****/
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);
}
/****** THIS IS WORKING FINE ! *******/
if (Session::get('modo') == 1){
if ( count ($pesquisa) > 0 && !($temp == null)){
$this['records'] = Evento::with('etiquetas')->whereHas('etiquetas', function($query) use ($cadeiapesquisa){
$query->where('etiqueta', 'regexp', "$cadeiapesquisa");
})->orderBy('id', 'DESC')->paginate(25);
} else {
Evento::paginate(25);
}
}
}

第一部分是战斗,但我会到达那里。 :)

蒂亚

[编辑]

问题解决了...到目前为止,我所做的测试中生成的代码狙击手如下:

if (Session::get('tipo') == 'etiqueta'){
$pesquisa = preg_split('/s+/', $temp, -1, PREG_SPLIT_NO_EMPTY);
$cadeiapesquisa = implode('|', $pesquisa);
$contagem = count($pesquisa);
if (Session::get('modo') == 0){
if ( strlen($cadeiapesquisa) > 0 ){
$this['records'] = Evento::with('etiquetas')->whereHas('etiquetas', function($query) use ($cadeiapesquisa, $contagem){
$query->where('etiqueta', 'regexp', "$cadeiapesquisa")->groupBy('evento_id')->having(DB::raw("COUNT('etiqueta_id')"), '>=', $contagem );
})->paginate(25);
} else {
$this['records'] = Evento::paginate(25);
}
}
if (Session::get('modo') == 1){
if ( strlen($cadeiapesquisa) > 0 ){
$this['records'] = Evento::with('etiquetas')->whereHas('etiquetas', function($query) use ($cadeiapesquisa){
$query->where('etiqueta', 'regexp', "$cadeiapesquisa");
})->paginate(25);
} else {
$this['records'] = Evento::paginate(25);
}
}
}

最新更新