如何在Laravel中更新别名列
我想更新Postgresql数据库和Laravel中的记录。 问题是alias列与表无关,但我首先创建了它们: 消息:“SQLSTATE[42703]:未定义列:7错误:关系“meas_kanal”的列“nivo600”不存在↵第1行:更新“meas_kanal”设置“recordtime”=1,“nivo600”=2,”。。。↵ 控制器中的功能:如何在Laravel中更新别名列,laravel,postgresql,pivot,Laravel,Postgresql,Pivot,我想更新Postgresql数据库和Laravel中的记录。 问题是alias列与表无关,但我首先创建了它们: 消息:“SQLSTATE[42703]:未定义列:7错误:关系“meas_kanal”的列“nivo600”不存在↵第1行:更新“meas_kanal”设置“recordtime”=1,“nivo600”=2,”。。。↵ 控制器中的功能: $student = Stamboliiski::where('recordtime', $request->get('kanal_id')
$student = Stamboliiski::where('recordtime', $request->get('kanal_id'))
->selectRaw('recordtime')
->selectRaw('max(formattedvalue) filter (where fullname = \'text 1\') as nivo600')
->selectRaw('max(formattedvalue) filter (where fullname = \'text 2\') as razhod600')
->update([
'recordtime' => $request->input('recordtime'),
'nivo600' => $request->input('formattedvalueN'),
'razhod600' => $request->input('formattedvalueR'),
])
->where(function ($query) {
$query->where('fullname', 'like', "text 1")
->orWhere('fullname', 'like', "text 2");
})
->groupBy('recordtime')
->orderBy('recordtime')
->first();
$success_output = '<div class="alert alert-success">The record is updated!</div>';
为什么?
在@Dimitri Mostrey的注释后编辑1:
$student = Stamboliiski::where('recordtime', $request->get('kanal_id'))
->selectRaw('recordtime')
->selectRaw('max(formattedvalue) filter (where fullname = \'text 1\') as nivo600')
->selectRaw('max(formattedvalue) filter (where fullname = \'text 2\') as razhod600')
->where(function ($query) {
$query->where('fullname', 'like', "text 1")
->orWhere('fullname', 'like', "text 2");
})
->groupBy('recordtime')
->orderBy('recordtime')
->first();
$student->recordtime = $request->get('recordtime');
$student->nivo600 = $request->get('formattedvalueN');
$student->razhod600 = $request->get('formattedvalueR');
$student->author = Auth::user()->name;
$student->save();
现在的错误是:
消息:“SQLSTATE[42703]:未定义列:7错误:关系“meas_kanal”的列“nivo600”不存在↵第1行:更新“meas_kanal”集合“nivo600”=$1,“razhod600”=$2,“a…”。。。↵ ^ (SQL:update“meas_kanal”set“nivo600”=1.86,“razhod600”=9.76,“author”=John Doe,“updated_at”=2020-04-30 10:22:28,其中“id”为空)
在这个方法中,它使用我不想要的id列,甚至我也不知道为什么它使用时间戳来代替
根据@Uzair Riaz的回复编辑2
不幸的是,问题仍然存在。在更改控制器和模型后,会收到成功消息,但没有任何更改。例如,如果我想在recordtime
2020-04-17 00:00:00
中将nivo600
的值更改为dd
中的1
App\StamboliiskiMeasCanal {#530
#connection: "stamboliiski"
#table: "meas_kanal"
#fillable: array:8 [
0 => "fullname"
1 => "formattedvalue"
2 => "recordtime"
3 => "qualitydesc"
4 => "statedesc"
5 => "author"
6 => "id"
7 => "updated_at"
]
#mapping: array:2 [
"nivo600" => "formattedvalue"
"razhod600" => "formattedvalue"
]
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:6 [
"recordtime" => "2020-04-17 00:00:00"
"nivo600" => "1.86"
"razhod600" => "9.76"
"author" => "Христиан Йорданов"
"formattedvalue" => "9.76"
"updated_at" => "2020-05-05 06:47:26"
]
#original: array:6 [
"recordtime" => "2020-04-17 00:00:00"
"nivo600" => "1.86"
"razhod600" => "9.76"
"author" => "Христиан Йорданов"
"formattedvalue" => "9.76"
"updated_at" => "2020-05-05 06:47:26"
]
#changes: array:4 [
"recordtime" => "2020-04-17 00:00:00"
"author" => "Христиан Йорданов"
"formattedvalue" => "9.76"
"updated_at" => "2020-05-05 06:47:26"
]
#casts: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#guarded: array:1 [
0 => "*"
]
}
似乎没有进行任何更新…如果这是您将要使用的唯一两个别名,我建议覆盖模型中的
->fill()
方法。将您的别名映射到$filleble
,如下所示:
class Stamboliiski extends Model
{
protected $fillable = ['fullname', 'formattedvalue', 'recordtime', 'qualitydesc', 'statedesc', 'author', 'id'];
protected $mapping = [
'nivo600' => 'formattedvalue',
'razhod600' => 'formattedvalue'
];
public function fill(array $attributes)
{
foreach ($attributes as $key => $value) {
if (isset($this->mapping[$key])) {
$attributes[$this->mapping[$key]] = $value;
unset($attributes[$key]);
}
}
return parent::fill($attributes);
}
}
然后您可以这样更新:
$student->update([
'recordtime' => $request->get('recordtime'),
'nivo600' => $request->get('formattedvalueN'),
'razhod600' => $request->get('formattedvalueR'),
'author' => Auth::user()->name
]);
所呈现的查询构建有点奇怪,你不觉得吗?Elounce使用PDO参数绑定。有2个->where方法调用,3个selectRaw,1个update,groupBy和orderBy只通过请求第一条记录完成。使用->first()或->get()首先构建集合并更新此集合。您试图在生成(最终确定)集合之前更新集合。这不会起作用。@DimitriMostrey您是对的,但仍然得到类似的错误。我更新了问题。
$student->nivo600=$request->get('formattedvalueN');$student->razhod600=$request->get('formattedvalueR'));
这两列在您的表中不存在,您无法更新它们,这就是出现错误的原因。我想您应该改为更新formattedvalue
字段?是的,我不会更新formattedvaluedd($student)
这并不重要,因为nivo600和razhod600在您的表中并不存在,所以在模型中更新它们将是无用的,因为它们无论如何都不会在数据库中更新。您需要的是一种方法来操作这两个别名列,以便最终更新formattedvalue。您是否使用观察者进行模型更新和保存?如果是,则没有这可能是解决这个问题的一种方法。不,我不使用观察者
$student->update([
'recordtime' => $request->get('recordtime'),
'nivo600' => $request->get('formattedvalueN'),
'razhod600' => $request->get('formattedvalueR'),
'author' => Auth::user()->name
]);