为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel - 尝试将数组值与模型值匹配

Laravel - 尝试将数组值与模型值匹配

PHP
守着星空守着你 2021-11-13 15:04:51
我有一个可以分解为数组的字符串:$array = explode(" ", $string);这给了我一个这样的数组:array:4 [▼  0 => "Employee"  1 => "Contract"  2 => "John" // first name  3 => "Smith" // last name]我需要通过数组中的 first_name 和 last_name 匹配用户。然而,名字和姓氏并不总是在数组中的这个顺序中。所以像:$user = User::where('first_name', 'LIKE', "%{$array}%")->where('last_name', 'LIKE', "%{$array}%")->first();这给了我一个数组到字符串转换异常。所以我一直在试图获得正确的查询以将我的数组中的名称与我的用户中的名称相匹配。
查看完整描述

3 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

如果您的数组始终相同(键 2 始终 === first_name 和键 3 始终 === last_name),您可以使用数组表示法来停止错误:


$user = User::where('first_name', 'LIKE', "%".$array[2]."%")->where('last_name', 'LIKE', "%".$array[3]."%")->first();

但是您已经说过,密钥并不总是相同的。如果是这种情况,您将需要提前编写一些内容来规范化数据。如果总是有一个像“员工”这样的“类型”,而这可能是什么的选择数量有限,你可以根据与类型的匹配来消除:


 foreach($array as $key=>$val){

    if(!in_array($val, $yourTypes)

         // set the value to first or last depending on the order these come in

或者,如果有某种方法可以在数组到达用户拉取之前对其进行标准化,您应该尝试这样做以确保您知道哪个值正在命中查询。类似于 CSV 文件的常见输入格式 - 用户必须按精确顺序设置列 - 如果您可以对此进行更正,则可以解决它。如果能够创建命名键,这也可以解决它,尽管根据您从简单字符串中提取的内容,这看起来是不可能的。一个更激进的步骤是让管理员手动匹配每个字符串的映射程序:IE 每个字符串被分解并显示在屏幕上,每个键编号和相应的值,管理员可以选择哪个键是first_name,哪个键是last_name。


但是尝试基于未知的多个不同的数组结构进行拉取,可能是不可能的。这就是为什么 API 通常会有专门定义的键和输出 - 不知道这会给手动干预带来负担,就像我上面提到的映射一样。


查看完整回答
反对 回复 2021-11-13
?
PIPIONE

TA贡献1829条经验 获得超9个赞

您可以使用list将分解后的数组字符串转换为变量。,,忽略前两个。


list(,, $fname, $lname) = explode(' ', $string);

这些成为声明的变量,可以像这样使用:

User::where('first_name', 'LIKE', "%{$fname}%")

    ->where('last_name',  'LIKE', "%{$lname}%")

    ->first();


查看完整回答
反对 回复 2021-11-13
?
慕斯709654

TA贡献1840条经验 获得超5个赞

如果您一直在位置 0 和 1 上,您将拥有“员工”和“合同”,您可以使用以下内容:



unset($array[0], $array[1]);


$array = $array = array_values($array);


$user = User::where('first_name', 'LIKE', "%{$array[0]}%")->where('last_name', 'LIKE', "%{$array[1]}%")->first();


查看完整回答
反对 回复 2021-11-13
  • 3 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信