在模型值及其关系中查找字符串的一部分的自定义搜索(一对多)
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();
【讨论】:
这正是我所需要的。我将查看文档以进一步了解如何有效地检索模型和关系。非常感谢!我不能投票给你,因为我是新人,但你完全明白了以上是关于在模型值及其关系中查找字符串的一部分的自定义搜索(一对多)的主要内容,如果未能解决你的问题,请参考以下文章