php - 将变量传递给查询会使用 Laravel 生成错误“尝试获取非对象的属性‘名称’”
问题描述
我正在使用 Laravel 6。我正在尝试使用表单创建一个验证系统来创建会议。当用户创建一个会议,参与者已经在另一个会议中被占用时,视图中应该会出现一条消息,其中包含已经占用的参与者的姓名。由于某种原因,应该找到参与者姓名的功能不起作用。我在 foreach 循环期间传递了一个 id,但是当我运行表单时出现以下消息:“尝试获取非对象的属性'名称'”。奇怪的是传递给函数的 id 是可以的,但是如果我在查询中写一个数字(例如“8”)代替 $id 会在视图中正确显示名称“Chris”。表格会议中“id_participants”列的格式为“23;7;6”。
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use DB;
use App\User;
class CheckParticipant implements Rule
{
protected $participants_occupied = array();
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
$participants = request('participants');
foreach($participants as $participant) {
$meetings = DB::table('meetings')
->where('is_active', '1')
->where('date', request('date_meeting'))
->where(function ($query) {
$query->where(function($sub_q) {
$sub_q->where('start_hour', '>=', request('start'))
->where('start_hour', '<', request('end'));
})
->orWhere(function($sub_q) {
$sub_q->where('start_hour', '<', request('start'))
->where('end_hour', '>=', request('end'));
})
->orWhere(function($sub_q) {
$sub_q->where('end_hour', '>', request('start'))
->where('end_hour', '<=', request('end'));
});
})
->where(function ($query) use($participant) {
$query->where('id_participants', $participant)
->orWhere('id_participants', 'like', '%;'.$participant)
->orWhere('id_participants', 'like', $participant.';%')
->orWhere('id_participants', 'like', '%;'.$participant.';%');
})
->get();
if(count($meetings) > 0) {
array_push($this->participants_occupied, $participant);
}
}
if(count($this->participants_occupied) > 0) {
return false;
} else {
return true;
}
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
for($i = 0; $i < count($this->participants_occupied); $i++) {
$this->participants_occupied[$i] = $this->getNameSurnameById($this->participants_occupied[$i]);
}
return 'The participants are already occupied at that time: ' . implode(',', $this->participants_occupied);
}
public function getNameSurnameById($id)
{
$users = User::all()->where('id', 18)->first(); //if I write a number in place of $id everything works
return $users->name;
}
}
我希望这个程序可以动态工作。我想变量 $id 的查询有问题。有人可以帮助我吗?
更新:
我解决了修改消息功能的问题,如下所示:
public function message() { $arr_names = array(); //I created this array for($i = 0; $i < count($this->participants_occupied); $i++) { array_push($arr_names, $this->getNameSurnameById($this->participants_occupied[$i])); } return 'The following participants are already occupied at that time: ' . implode(', ', $arr_names); }
我想问题在于我将一个字符串值(参与者的名称)赋予了一个具有整数值(参与者的 id)的数组。我解决了创建一个新的空数组并将名称推送到新数组的问题。
解决方案
id
你可能会发现基于某种类型的 Laravel 对象而不是数组来获取你的 s 更容易。我怀疑数组在循环期间的某个时间点id
的索引处具有不正确的值(不是 ) 。$i
而且,正如@Cristóbal Ramos Merino 在评论中所指出的那样,您正在将变量设置为潜在的字符串(用户名),同时您试图将可能的id
传递给getNameSurnameById()
方法。
我会抓取id
从表单传递的所有 s,对User进行数据库查询以查看谁已经被占用,然后从结果集合中提取名称。
就像是:
$allFormUsers = User::whereIn('id', $formIds)->get();
然后在此循环以获取被占用者的名称:
$occupiedNames = [];
foreach($AllFormUsers->where('occupied', 1) as $u){
$occupiedNames[] = $u->name;
}
我不知道你是如何跟踪占用的——所以上面的代码只不过是伪代码,但希望能让你知道如何在没有数组/并发的情况下做到这一点。这在数据库上的工作也少了一点,因为您有一个查询,而不是每次都在单个查询上循环。您甚至可以先拉出所有用户,以便将它们存储起来,然后根据需要where('occupied', 1)
对集合执行操作,如上面的循环中所示。(假设这就是您跟踪占用的方式)
推荐阅读
- c# - c# - 将 DataGridView 导出为 PDF 代码生成错误
- python - 隔离在 pd.Excelread 中出现错误的 Excel 文件
- vue.js - 如何修复 vue-cli-service 漏洞?
- r - ggplot2 3并排直方图
- xml - 为 xml 初始化模板内的变量指定次数
- react-native - Native-base Invariant Violation:文本字符串必须在文本组件中呈现
- kernel - 如何处理linux内核中的一般保护错误
- php - 如何将mysql获取的数据再次插入数据库表E
- linux - 如何使用 awk 在文件中搜索包含美元符号 ($) 的单词
- powershell - 使用powershell更改属性