【问题标题】:Sql leftJoin query using laravel syntax showing error使用 laravel 语法显示错误的 Sql leftJoin 查询
【发布时间】:2017-09-13 03:11:51
【问题描述】:

这是我用于左连接的查询,它工作正常,但是当我将它转换为 laravel 语法时,有些东西丢失了。

要转换的查询是

$result = DB::select("select amenities.name as 
name,amenities.type_id,amenities.id as id, amenities.icon, rooms.id as status 
from amenities left join rooms on find_in_set(amenities.id, rooms.amenities) 
and rooms.id = $room_id and type_id !=4");

我正在这样做

$result = DB::table('amenities')
            ->select('amenities.name as name', 'amenities.type_id' , 'amenities.id as id'
                , 'amenities.icon', 'rooms.id as status' )
            ->leftJoin('rooms', function ($join) {
                 $join->on('FIND_IN_SET(amenities.id, rooms.amenities)')
                      ->where('rooms.id' , '=', '$room_id')
                      ->where('type_id','!=', 4);
            })->get();

错误是

InvalidArgumentException 在 F:\xampp\htdocs\arheb\Arheb\vendor\laravel\framework\src\Illuminate\Database\Query\JoinClause.php 第 79 行:on 子句的参数不足。

【问题讨论】:

  • 原始查询中没有Where 子句。您能否在您尝试的第二个查询中将where 更改为and
  • 我如何添加和而不是在哪里,所以你的意思是我在括号内添加和,我不知道 laravel 是如何工作的,这就是为什么我使用 where 所以它对待它就像和。
  • 对不起。将 where 单词更改为 on。这应该推断出join 上的and 条件。
  • 你的意思是像这个 $result = DB::table('amenities') ->select('amenities.name as name', 'amenities.type_id' , 'amenities.id as id ' , 'amenities.icon', 'rooms.id as status' ) ->leftJoin('rooms', function ($join) { $join->on(DB::raw("find_in_set(amenities.id, rooms.便利设施)")) ->on('rooms.id' , '=', '$room_id') ->on('type_id','!=', 4); })->get();跨度>

标签: mysql sql laravel laravel-5


【解决方案1】:

您的查询是错误的。我假设amenities.idrooms.amenities 分别是amenitiesrooms 表的属性。

如果字符串存在于字符串列表中(作为子字符串),MySQL FIND_IN_SET() 返回字符串的位置。

您需要在on() 函数的第一个和第二个参数中传递列名。

$result = DB::table('amenities')
            ->select('amenities.name as name', 'amenities.type_id' , 'amenities.id as id'
                , 'amenities.icon', 'rooms.id as status' )
            ->leftJoin('rooms', function ($join) {
                 $join->on('amenities.id', '=', 'rooms.amenities')
                      ->where('rooms.id' , '=', '$room_id')
                      ->where('type_id','!=', 4);
            })->get();

【讨论】:

  • 仍然显示错误 On 子句的参数不足。
  • 哪个代码?我复制了你的代码并检查了它,但它显示错误
  • 那么为什么不能使用find_in_set,是不是laravel不支持
【解决方案2】:

我想你可以试试这个:

$result = DB::table('amenities')
           ->select('amenities.name as name', 'amenities.type_id' , 'amenities.id as id'
               , 'amenities.icon', 'rooms.id as status' )
           ->leftJoin('rooms', function ($join) {
                $join->on(DB::raw("find_in_set(amenities.id, rooms.amenities)"))
                     ->where('rooms.id' , '=', '$room_id')
                     ->where('type_id','!=', 4);
           })->get();

希望这对你有用!

【讨论】:

  • 不,亲爱的,它在 F:\xampp\htdocs\arheb\Arheb\vendor\laravel\framework\src\Illuminate\Database\Query\JoinClause.php 第 79 行中显示相同的错误 InvalidArgumentException:不on 子句有足够的参数。
猜你喜欢
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 2018-09-13
  • 2019-02-04
  • 2019-05-10
  • 2016-02-04
相关资源
最近更新 更多