Как обновить столбец псевдонимов в Laravel - PullRequest
2 голосов
/ 23 апреля 2020

Я хочу обновить записи в Postgresql БД и Laravel. Проблема в том, что столбцы псевдонимов не связаны с таблицей, но я сделал их на первом месте:

сообщение: «SQLSTATE [42703]: неопределенный столбец: 7 ОШИБКА: столбец« nivo600 »из отношение "measure_kanal" не существует↵ ЛИНИЯ 1: обновить "measure_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>';

Модель:

class Stamboliiski extends Model
{
    protected $connection = 'stamboliiski';
    protected $table = 'meas_kanal';
    protected $fillable = ['fullname','formattedvalue','recordtime','qualitydesc','statedesc','author','id'];
}

Почему?

РЕДАКТИРОВАТЬ 1 после комментария @Dimitri Mostrey:

$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 ОШИБКА: столбец« nivo600 »отношения« measure_kanal »не существует↵LINE 1: обновить« measure_kanal »установить« nivo600 »= $ 1,» razhod600 "= $ 2," a ... ↵ ^ (SQL: обновить набор "measure_kanal" "nivo600" = 1.86, "razhod600" = 9.76, "author" = Джон Доу, "updated_at" = 2020-04-30 10:22:28 где "id" равен нулю) "

В этом методе используются столбцы идентификаторов, которые мне не нужны, и даже я не знаю, почему вместо них использовалась метка времени .

РЕДАКТИРОВАТЬ 2 при ответе @Uzair Riaz

К сожалению, проблема все еще здесь. После смены контроллера и модели появляется сообщение об успехе, но ничего не меняется. Например, если я хочу изменить значение nivo600 на 1 в recordtime 2020-04-17 00:00:00. После того, как я эхом $student в dd:

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 => "*"
  ]
}

Кажется, что обновление не производится ...

1 Ответ

0 голосов
/ 05 мая 2020

Если это только два псевдонима, которые вы собираетесь использовать, я предлагаю переопределить метод ->fill() в вашей модели. Сопоставьте свои псевдонимы с $fillable следующим образом:

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
        ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...