我正在尝试将普通 SQL 查询移至 Laravel 查询生成器。
这不是我第一次这样做,但现在“出现了不同的情况”。
我需要为连接设置排序规则,在普通 SQL 中这是没有问题的:
"...
LEFT OUTER JOIN " . $pltable1 . " on PL01001=supplier collate Latvian_BIN
..."
Run Code Online (Sandbox Code Playgroud)
当我尝试时 Laravel 抛出错误:
->leftJoin($pltable1, "PL01001", "=", "supplier");
Run Code Online (Sandbox Code Playgroud)
无法解决等于操作中“SQL_Latin1_General_CP1_CI_AS”和“Latvian_BIN”之间的排序规则冲突。
我知道这是因为我没有指定连接排序规则,但我不知道如何执行此操作。有没有人遇到过类似的事情并找到解决方案?
PS 我无法更改表本身的默认排序规则
我有PurchaseOrderProduct模型从中获取类似的数据
PurchaseOrderProduct::with('products')
->with('warehouse_locations')
->with('productStatuses')
->with('purchase_orders')
->where('product_id', $request->product_id)
->where('free_qty', '>=', 1)
->get();
Run Code Online (Sandbox Code Playgroud)
现在在这个表中,我有一个expiry_date类型的列datei想要获取orderBy expiry_date最接近当前日期的数据。
意味着purchase_order_product到期日期最接近当前日期的应该排在第一位。
我正在使用 Laravel 5.3 开发 Web 应用程序。我现在遇到了 Laravel 查询构建器方法 whereIn 的问题。这是我的场景:
我有这样的桌子。
student - id, name, dob
course - id, code
student_course - student_id, course_id
Run Code Online (Sandbox Code Playgroud)
我想要做的是让学生通过 student_course 表的 course_id 搜索而不加入任何表。在手动查询中,我喜欢这样。
SELECT * FROM `student` WHERE `student`.`id` IN (SELECT `student_id` FROM `student_course` WHRE `course_id`= ?)
Run Code Online (Sandbox Code Playgroud)
所以现在当我尝试将它转换为 Laravel 查询构建器时,我遇到了问题。这是我的代码:
DB::table('student')->whereIn('id',[ "Here I want to run sub query" ])->get();
Run Code Online (Sandbox Code Playgroud)
正如您在 whereIn() 的第二个参数中所见,我遇到了问题。在这种情况下,我是否需要运行原始查询?如何将原始查询作为第二个参数运行?如果不是,我怎样才能在像上面这样的一个查询中按 course_id 过滤而不加入任何表?
我有一个名为errors以下字段的表:id, website_id, message & level.我正在尝试获得错误最多的前5个网站.
询问
SELECT website_id, COUNT(id) AS 'errors'
FROM errors GROUP BY website_id ORDER BY COUNT(*) DESC
我不知道如何使用Laravel Query Builder和Eloquent来做到这一点.谁能帮我吗?
数据库截图
这是一个为什么的问题,而不是操作方法:)
我已将查询巨石分配给变量$ query:
$query = table::where(['id'=>1, 'this_version'=> 1]);
$versions['slug1'] = $query->select('tourist_id', 'tourist_version')->get()->toArray();
print_r($versions);
Run Code Online (Sandbox Code Playgroud)
输出带有2(!)子数组的数组:
Array
(
[slug1] => Array
(
[0] => Array
(
[tourist_id] => 1
[tourist_version] => 1
)
[1] => Array
(
[tourist_id] => 2
[tourist_version] => 1
)
)
)
Run Code Online (Sandbox Code Playgroud)
但是,如果我在$ query声明和获取$ version [2]数组之间使用$ query添加另一行,我的$ version [2]输出将缩短为一维数组:
$query = previoustour2_tourist::where(['tour2_id'=>$tour->id, 'this_version'=> 1]);
// Added line:
$versions['slug0'] = $query->select('version_created')->first()->version_created;
//
$versions['slug1'] = $query->select('tourist_id', 'tourist_version')->get()->toArray();
print_r($versions);
Run Code Online (Sandbox Code Playgroud)
输出(注意slug1现在只有1个嵌套数组):
Array
(
[slug0] => 2017-08-08 08:25:26
[slug1] => Array
(
[0] …Run Code Online (Sandbox Code Playgroud) 我有这个 sql (MariaDB) 查询,它工作正常:
SELECT
admin_combustibles.nombre,
admin_combustibles.id_combustible,
admin_combustible_unidades.nombre AS unidades,
admin_tipo_combustibles.nombre AS tipo_combustible,
admin_indice_combustibles.valor_combustible
FROM
admin_combustibles
INNER JOIN admin_combustible_unidades ON admin_combustibles.combustible_unidades_id = admin_combustible_unidades.id_combustible_unidad
INNER JOIN admin_tipo_combustibles ON admin_combustibles.tipo_combustible_id = admin_tipo_combustibles.id_tipo_combustible
LEFT JOIN admin_indice_combustibles ON admin_combustibles.id_combustible = admin_indice_combustibles.combustible_id
AND admin_indice_combustibles.anio = 1992
AND admin_indice_combustibles.mes = 6
ORDER BY
admin_combustibles.nombre
Run Code Online (Sandbox Code Playgroud)
但是当我尝试通过 Laravel 进行访问时,我遇到了一些错误,因为 Laravel在数字 1992 上放了一些,这样查询就不起作用了。
另外,我不知道如何AND在 Laravel 上做,我只有orOn但它不起作用:
$datos = AdminCombustible::select([
'admin_combustibles.nombre',
'admin_combustibles.id_combustible',
'admin_combustible_unidades.nombre AS unidades',
'admin_tipo_combustibles.nombre AS tipo_combustible',
'admin_indice_combustibles.valor_combustible'])
->join('admin_combustible_unidades', 'admin_combustibles.combustible_unidades_id', '=', 'admin_combustible_unidades.id_combustible_unidad')
->join('admin_tipo_combustibles', 'admin_combustibles.tipo_combustible_id', …Run Code Online (Sandbox Code Playgroud) 我需要获取按数据排序的表的最后10条记录,并将它们反转。
这是相反的代码:
$eventi = \App\Model::with('relation_1', 'relation_2')
->orderBy('data_ora', 'desc')
->take(10)
->get();
Run Code Online (Sandbox Code Playgroud)
如果我记录结果,我将得到:
[{"id":12297,"stato_batteria":null,"data_ora":"2018-05-03 11:40:02" ...
Run Code Online (Sandbox Code Playgroud)
反向代码为:
$eventi = \App\Model::with('relation_1', 'relation_2')
->orderBy('data_ora', 'desc')
->take(10)
->get()
->reverse();
Run Code Online (Sandbox Code Playgroud)
如果我记录结果,我将得到:
{"9":{"id":1410,"stato_batteria":null,"data_ora":"2018-04-05 14:16:48" ...
Run Code Online (Sandbox Code Playgroud)
如您所见,集合已更改,我不知道为什么。
所以,我可以使用User::where('username', '!=', null)->get();
但是,我的情况是我希望使用if条件从第一个开始链接查询,where('username', '!=', null)在这种情况下是不必要的.让我举一个伪示例:
我正在运行基于用户的报告,其中有多个字段.我想像这样初始化查询构建器,并使用if语句链查询.
$user = User::class(); // I know I can't use this line, however you'll get the idea.
if (isset($gender)) {
$user = $user->where('gender', $gender);
}
if (isset($age)) {
$user = $user->where('age', $age);
}
$users = $user->get()
Run Code Online (Sandbox Code Playgroud)
是启动查询(在第一行)的唯一方法:
$user = User::where('username', '!=', null)
Run Code Online (Sandbox Code Playgroud) 我需要使用'限制'从数据库获取数据如何在laravel中执行此操作?雄辩
->limit($value)
Run Code Online (Sandbox Code Playgroud)
只需要一个值,但我需要得到一个范围.我的意思是例如在请求中我发送起点和范围:
0 and 10 (i want to start getting records from first and get next 10)
Run Code Online (Sandbox Code Playgroud)
然后
10 and 10 (i want to start getting records from 10th and get next 10)
Run Code Online (Sandbox Code Playgroud)
在MySQL中查询它可能使得LIMIT 0, 10 / LIMIT 10, 10
laravel的方法是什么?->limit(0,10)?
如何将我的变量绑定到 addSelect()?
我的代码中有这个:
$query->addSelect( DB::raw('MATCH(matchy.val) against ("'.addslashes($q).'") as relevance ') );
Run Code Online (Sandbox Code Playgroud)
addlashes() 远不理想,我应该绑定到 ? 反而。我该怎么做 addSelectRaw() 呢?