2017-08-02 63 views
0

我有一本包含许多科目表(一对多关系)主题的书籍表。来自Laravel 5.3中的连接表的搜索查询

我想加入我的表是这样的:

$book = Book::latest() 
    ->leftjoin('subjects', 'books.id', '=', 'subjects.book_id') 
    ->select('books.*', 'subjects.subject') 
    ->where('subject', 'like', '%' .$search. '%') 
    ->paginate(20); 

我想要一个搜索查询,将显示具有主题匹配形成$search变量的书籍。但是,由于书中有很多主题,所以它会一直显示一本书,具体取决于与$ search变量匹配的书的多少个主题。

我只想显示一本书,无论这本书匹配了多少个主题。

下面这张图片是搜索查询我做的输出的$search= ""

在我搜索“一个”搜索框第二图像通知值:

这本题为“特殊教育评估:发布影响今日教室的策略”的书(在第一张图片上看到它;因为该书的主题是6,它被冗余6次)

+1

尝试添加' - > GROUPBY( 'books.id') - > PAGINATE(20);' – Maraboc

+0

它只是给我此错误SQLSTATE [42000 ]:语法错误或访问冲突:1055'bisu_ccc_library.books.ISBN'不在GROUP BY中(SQL:从'books'中选择不同的'books'。*,'subject'.'subject' 'books'.'id' ='subjects'.'book_id' where'subject' like%a%group by'books'.'id' order by'created_at' desc limit 20 offset 0) –

+0

女巫版的拉拉维尔你使用 ? – Maraboc

回答

0

在MySQL的文档中提到要显示只有当你的书ID必须组一本书(或任何其他唯一列)

->groupBy('books.id'); 

提个醒,here

SQL92及更早版本不允许查询的选择列表,HAVING条件或ORDER BY列表引用未在GROUP BY子句中命名的非聚集列。

因此,错误消息'bisu_ccc_library.books.ISBN' isn't in GROUP BY

要绕过这一点,在Laravel关闭strict,一切都会很好地工作。 转到config/database.php和MySQL配置阵列中,更改strict => truestrict => false

+0

非常感谢,它的工作原理! –

0

我想你想使用distinct您选择

$book = Book::latest() 
    ->leftjoin('subjects', 'books.id', '=', 'subjects.book_id') 
    ->select('books.*', 'subjects.subject') 
    ->distinct() 
    ->where('subject', 'like', '%' .$search. '%') 
    ->paginate(20); 

就像在常规的SQL(这将转化为)将“强制查询只返回不同的结果。” (从laravel api docs

的SELECT DISTINCT语句用于返回唯一不同 (不同的)值。

在表格中,一列通常包含许多重复值;和 有时你只想列出不同的(不同的)值。

SELECT DISTINCT语句用于仅返回不同的 (不同)值。 - W3Schools

+0

我试图添加截然不同的,但你仍然工作 –