如何使用 WHERE LIKE (或等效)搜索 Laravel 集合
Posted
技术标签:
【中文标题】如何使用 WHERE LIKE (或等效)搜索 Laravel 集合【英文标题】:How can I search a Laravel collection using WHERE LIKE (or equivalent) 【发布时间】:2021-08-15 07:03:30 【问题描述】:我目前正在使用 Laravel 开发一个设备预订登记/日历系统。
设备可以根据需要直接预订给员工或安排在未来的日期。
例如,笔记本电脑 1 可能有三个预订,但笔记本电脑一次只能预订给一个人。
系统已启动并运行,用户可以搜索当前/预定的预订。
但我无法让用户搜索员工姓名,因为我需要拆分查询。
如您所见,我首先从第 7-14 行获取所有设备。
然后,我将每个设备的所有预订附加到 $bookings
集合中的一个名为“可用预订”的新键中。
我想知道如何搜索 staff_name 字段的可用预订键,因为我已经将 eloquent 查询作为集合返回。
public function searchCurrentBookings(Request $request)
// Making sure the user entered a keyword.
if ($request->has('query'))
//Get all devices
$bookings = devices::where('device_status', '!=', 'decommisioned')
->where(function ($query)
$query->Where('devices.device_id', 'like', '%' . request('query') . '%')
->orWhere('device_serial', 'like', '%' . request('query') . '%')
->orWhere('model_name_fk', 'like', '%' . request('query') . '%')
->orWhere('device_status', 'like', '%' . request('query') . '%');
)
->get();
//Append all of the bookings for each device to collection
foreach($bookings as $booking)
$booking->available_bookings = bookings::leftJoin('staff','staff.staff_id','bookings.checked_out_to')
->where('device_id', '=',$booking->device_id)
->WhereIn('bookings.status', ['scheduled', 'checked_out'])
//How can I search the available bookings in this collection?
$collection = $bookings->available_bookings->Where('staff_name', 'like', '%' . request('query') . '%')
// If there are results return them, if none, return the error message.
return $bookings->count() ? $bookings : $error;
这是 $bookings 对象的示例
[
"device_id": "Laptop 1",
"device_serial": "63YNERQN",
"model_name_fk": "Dell Latitude 3310",
"device_status": "unavailable",
"available_bookings": [
"id": 45,
"device_id": "Laptop 1",
"date_from": "1-May-2021",
"date_to": "5-May-2021",
"status": "checked_out",
"checked_out_to": 1,
"updated_at": "2021-05-27T11:52:13.000000Z",
"staff_id": 1,
"staff_name": "Jaden Bird"
,
"id": 46,
"device_id": "Laptop 1",
"date_from": "6-May-2021",
"date_to": "8-May-2021",
"status": "scheduled",
"checked_out_to": 2,
"updated_at": "2021-05-27T11:52:13.000000Z",
"staff_id": 2,
"staff_name": "Lilo Berry"
,
"id": 47,
"device_id": "Laptop 1",
"date_from": "17-May-2021",
"date_to": "27-May-2021",
"status": "scheduled",
"checked_out_to": 4,
"updated_at": "2021-05-27T11:52:13.000000Z",
"staff_id": 4,
"staff_name": "Barbora Forester"
]
,
"device_id": "Laptop 3",
"device_serial": "PNX9N8R8",
"model_name_fk": "Dell Latitude 7490",
"device_status": "unavailable",
"available_bookings": [
"id": 48,
"device_id": "Laptop 3",
"date_from": "5-May-2021",
"date_to": "8-May-2021",
"status": "checked_out",
"checked_out_to": 3,
"updated_at": "2021-05-27T11:52:13.000000Z",
"staff_id": 3,
"staff_name": "Kaiden Ojeda"
]
,
"device_id": "Laptop 4",
"device_serial": "GTUEDDDH",
"model_name_fk": "Dell Latitude 5300",
"device_status": "available",
"available_bookings": [
"id": 50,
"device_id": "Laptop 4",
"date_from": "30-May-2021",
"date_to": "30-May-2021",
"status": "scheduled",
"checked_out_to": 6,
"updated_at": "2021-05-27T11:52:13.000000Z",
"staff_id": 6,
"staff_name": "Luka Evans"
]
,
"device_id": "Projector",
"device_serial": "Projector",
"model_name_fk": "Epson EH-TW550",
"device_status": "available",
"available_bookings": []
]
以下系统的示例图像。 我想在所有预订中搜索员工姓名或仅在活动预订中搜索(以更容易者为准)。
数据库结构如下:
型号:
设备:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Devices extends Model
#use HasFactory;
protected $table = 'devices';
/**
* @var string $primaryKey Name of the primary key
*/
protected $primaryKey = 'device_id';
/**
* @var bool $incrementing The PK does not increment
*/
public $incrementing = false;
/**
* @var string $keyType Primary key is a string (i.e. not an integer)
*/
protected $keyType = 'string';
/**
* @var array $fillable The attributes that are mass assignable.
*/
protected $fillable = [
'device_id',
'device_serial',
'model_name_fk',
'device_status'
];
public function bookings()
$this->hasMany(Bookings::class, 'device_id', 'device_id');
预订:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Bookings extends Model
#use HasFactory;
protected $table = 'bookings';
/**
* @var string $primaryKey Name of the primary key
*/
protected $primaryKey = 'id';
/**
* @var bool $incrementing The PK does not increment
*/
public $incrementing = true;
/**
* @var string $keyType Primary key is a string (i.e. not an integer)
*/
protected $keyType = 'integer';
/**
* @var array $fillable The attributes that are mass assignable.
*/
protected $fillable = [
'device_id',
'date_from',
'date_to',
'status',
'checked_out_to'
];
public function staff()
$this->belongsTo(Staff::class, 'checked_out_to', 'staff_id');
员工:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Staff extends Model
protected $table = 'staff';
/**
* @var string $primaryKey Name of the primary key
*/
protected $primaryKey = 'staff_id';
/**
* @var bool $incrementing The PK does not increment
*/
public $incrementing = true;
/**
* @var string $keyType Primary key is a string (i.e. not an integer)
*/
protected $keyType = 'integer';
/**
* @var array $fillable The attributes that are mass assignable.
*/
protected $fillable = [
'staff_id',
'staff_name'
];
【问题讨论】:
能否请您分享您的Booking eloquent模型类以进一步了解, @JibinBose 嗨 Jibin - 我的 Bookings 模型是默认模型,没有任何更改,设备模型只有主键设置为 device_id 并且没有递增,因为我的设备 pk 是一个字符串(device_id 是 PK) .所以我不确定分享它会有多大帮助。我已经在我的数据库结构的原始帖子中放了一张图片,但如果这有帮助的话。谢谢 【参考方案1】:希望这对您有所帮助。
在您的设备模型类文件中添加关系。
public function bookings()
return $this->hasMany(Booking::class, 'device_id', 'device_id');
在您的 Booking 模型类文件中添加关系。
public function staff()
return $this->belongsTo(Staff::class, 'checked_out_to', 'staff_id');
现在在您的控制器文件中,您可以使用以下内容过滤关系数据。
$search = $request->search_name;
$bookings = Device::with('bookings', 'bookings.staff')->whereHas('bookings.staff', function($q) use($search)
return $q->where('staff_name', 'like', '%' . $search .'%');
)->get();
在调用get()
函数之前,在 Booking 表中添加您需要的所有其他查询条件。
注意:我希望我的表格关系正确。如果不是,请根据您的映射进行更正。
编辑:我忘记在模型关系函数中添加返回语句。我已经更新了我的答案。
【讨论】:
谢谢你,不幸的是我遇到了一些错误。使用 hasWhere 我收到 - 在 null 上调用成员函数 getRelationExistenceQuery()。如果我将 whereHas 更改为仅 Where 我收到 Column not found: 1054 Unknown column 'bookings.staff' in 'where clause' (SQL: select * fromdevices
where bookings
.staff
= (select * where @ 987654328@ 喜欢 %Jaden%))。我确实需要更多地阅读口才关系,所以也许我错过了一些简单的东西。如果有帮助,我已经在我的原始帖子中添加了所有模型(有更改)。我觉得它一定是我想念的简单的东西。谢谢
嗨,对不起,它现在正在工作! :) 你是个传奇!我只需要在每个模型函数中返回关键字。我应该阅读更多关于 elloquent 关系的内容,因为我认为它可以改进我的应用程序的其他方面。非常感谢您的帮助!
@masterg174 很抱歉错过了 return 关键字。乐意效劳。继续学习。以上是关于如何使用 WHERE LIKE (或等效)搜索 Laravel 集合的主要内容,如果未能解决你的问题,请参考以下文章