在模型值及其关系中查找字符串的一部分的自定义搜索(一对多)

Posted

技术标签:

【中文标题】在模型值及其关系中查找字符串的一部分的自定义搜索(一对多)【英文标题】:Custom search that look for part of a string inside values of a model and its relationship (one to many) 【发布时间】:2022-01-05 00:45:39 【问题描述】:

我有一个搜索输入文本,它使用 ajax 来搜索一些文章(文章是一个模型)。此外,我与另一个模型“ArticleFile”建立了一对多的关系。本质上,我需要查看文章表的“标题”或“描述”列中是否有一个值包含字符串,或者(这是最难的部分)在文章文件表的列文件名中,列article_id。由于许多文章包含附加到它的文件列表,有没有办法搜索文章的标题、描述或附加到它的文件名是否具有类似于我的代码的某个字符串?或者有其他方法可以实现吗?

我的文章模型中的一对多关系:

public function files() 
   return $this->hasMany(ArticleFile::class);

在我的 ajax 调用的 php 文件中,我有以下方法来检索正确的文章(这不起作用):

public function ajax_article_search()

  $value = $_POST['value'];
  $html = '';

  if($value) 
    
    // search if the title
    // or description
    // or filenames (of the relationship one-to-many)
    // have a certain $value
    $articles = Article::where('title', 'like', '%'.$value.'%') 
      ->orWhere('description', 'like', '%'.$value.'%') 
      ->files->where('filename', 'like', '%'.$value.'%') 
      ->get(); 
    
    // -- Code above not working
    // Error because of ->files...
        
    foreach($articles as $article) 
      $html .= '<a href="'.$article->url.'">';
      $html .= '<p>'.$article->title.'</p>';
      $html .= '</a>';
    
  

  echo $html;

【问题讨论】:

【参考方案1】:

要查询关系,您可以使用whereHas()(或在本例中为orWhereHas()):

$articles = Article::where('title', 'like', '%'.$value.'%')
    ->orWhere('description', 'like', '%'.$value.'%')
    ->orWhereHas('files', function ($query) use($value) 
        $query->where('filename', 'like', '%'.$value.'%');
    )
    ->get(); 

【讨论】:

这正是我所需要的。我将查看文档以进一步了解如何有效地检索模型和关系。非常感谢!我不能投票给你,因为我是新人,但你完全明白了

以上是关于在模型值及其关系中查找字符串的一部分的自定义搜索(一对多)的主要内容,如果未能解决你的问题,请参考以下文章

二分查找及其应用总结

Django:在多对多关系中查找所有值,其中相关集合的所有元素都符合特定条件

Power Query - 复杂的自定义列

算法python实现二叉搜索树插入删除查找

保存时使用字符串作为猫鼬模型的自定义 ID

根据模型预测,使用丢失的自定义函数的返回值