Laravel 怎么样用数组的方式构造一个多字段查询?

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Support\Facades\Cookie;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Models\link;

class LinkController extends BaseController
{

public function index(Request $request) {

    $map = [];
    if ($request->has('search')) {
        $keywords = $request->keywords;

        $map = [
            ['class_key', 'like', '%' . $keywords . '%'],
            ['name', 'like', '%' . $keywords . '%']
        ]; 
    }

    $list = link::where($map)->paginate($this->paginate);
    return view('admin.link.index', compact('list'));

}

}

像这样的代码最终生成的是两个字段AND,我想改成OR,有办法吗?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 7
shubiao-yao

$list = link::where(function ($query) {
$query->orWhere('class_ke', 'like', '%' . $keywords . '%')
->orWhere('name', 'like', '%' . $keywords . '%');
})->paginate($this->paginate);

试试吧

5年前 评论
shubiao-yao

public function index(Request $request)
{

if ($request->has('search')) {
    $map = function($query) use ($request->keywords) {
        $query->orWhere('class_ke', 'like', '%' . $keywords . '%')->orWhere('name', 'like', '%' . $keywords . '%');
    };
}
if (isset($map)) {
      $list = link::where($map)->paginate($this->paginate);
} else {
      $list = [];
}

return view('admin.link.index', compact('list'));

}

5年前 评论
shubiao-yao

写的还是不好,这评论的内容不能再次编辑 好蛋疼啊

5年前 评论

貌似这种情况用不了数组形式查询~~~~只能用orWhere,感觉确实不方便,我也想吐槽···哈哈···我是想用数组方式实现in查询,结果好像走不通····你要是有啥好方法记得分享一下哈··我也是刚用laravel不久

5年前 评论

<?php
namespace App\Models\traits;
use Illuminate\Support\Facades\Schema;

trait Sort
{
// 根据 URl 参数自动排序
protected function _sort($query, $key = '')
{
$columns = Schema::getColumnListing($this->getTable());
$options = [];
if(is_array($key)) {
$options = $key;
} else if(is_string($key) && !empty($key)) { // 字符串使用自定义格式用于URL,否则用数组
list($field, $value) = explode('-', $key);
if (in_array($value, ['desc', 'asc']) && in_array($field, $columns)) {
$options = [$field => $value];
}
}
$query->->orderBy($options[0], $options[1]);
}
}
换个思路 ,从这点来看,Laravel还真不如TP5的查询强大

5年前 评论

数组方式,是不是不支持啊?我也是这样写的,但是不起作用。最后只能用多个->where()去做的。感觉不爽。我记得tp这样写是没问题的。但是laravel好像不行。但是如果是查询的是时间
$mintime = strtotime($pre_arrive_time);
$maxtime = $mintime+86400;
$where[] = ['pre_arrive_time','>=',$mintime];
$where[] = ['pre_arrive_time','<',$maxtime];
$order_result->where($where);
这样写却又生效了,不知道什么原因

5年前 评论

查询条件可以这样写
$map = [
['class_key', 'like', '%' . $keywords . '%'],
['name', 'like', '%' . $keywords . '%,'or'']
];

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!