如何在Laravel中更新别名列

如何在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')

我想更新Postgresql数据库和Laravel中的记录。 问题是alias列与表无关,但我首先创建了它们:

消息:“SQLSTATE[42703]:未定义列:7错误:关系“meas_kanal”的列“nivo600”不存在↵第1行:更新“meas_kanal”设置“recordtime”=1,“nivo600”=2,”。。。↵

控制器中的功能:

$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
字段?是的,我不会更新formattedvalue
dd($student)
这并不重要,因为nivo600和razhod600在您的表中并不存在,所以在模型中更新它们将是无用的,因为它们无论如何都不会在数据库中更新。您需要的是一种方法来操作这两个别名列,以便最终更新formattedvalue。您是否使用观察者进行模型更新和保存?如果是,则没有这可能是解决这个问题的一种方法。不,我不使用观察者
$student->update([
            'recordtime' => $request->get('recordtime'),
            'nivo600' => $request->get('formattedvalueN'),
            'razhod600' => $request->get('formattedvalueR'),
            'author' => Auth::user()->name
        ]);