在Laravel 5.3中搜索来自联接表的查询

时间:2017-08-02 18:43:42

标签: laravel join eloquent

我有一个书桌,其中包含我主题表上的许多主题(一对多关系)。

我试着像这样加入我的桌子:

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

我想要一个搜索查询,该搜索查询将显示具有与$search变量匹配的主题的书籍。然而,由于一本书有很多科目,因此它会根据在$ search变量上匹配的书的主题数量而冗余地显示一本书。

我只想一次出版一本书,无论这本书匹配多少科目。

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

的值

在第二张图片上,我在搜索框中搜索“a”:

这本书名为“特殊教育评估:影响当今教室的问题策略”(见第一张图片;自该书的主题为6册以来,它已多次出现6次)

2 个答案:

答案 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语句用于仅返回distinct   (不同的)价值观。

     

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

     

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

答案 1 :(得分:0)

仅在必须按图书ID(或任何其他唯一列)分组时才显示图书

->groupBy('books.id');

请注意,正如MySQL doc here

中所述
  

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

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

要绕过此功能,请关闭Laravel中的strict,一切都会正常运行。 转到config/database.php并在mysql配置数组中,将strict => true更改为strict => false