SQLSTATE[42S22]: Столбец не найден: 1054 Неизвестный столбец '' в 'предложении where'

Я получаю ошибку

"SQLSTATE[42S22]: Столбец не найден: 1054 Неизвестный столбец '' в 'предложении where' "

с выходом sql:

    update `contactables` set `updated_at` = 2019-08-16 20:35:56, `active` = 0 where `` is null and `key_ID` = 235852

Я пытался использовать красноречивый метод firstOrNew/firstOrCreate на полиморфной модели. Я пробовал всевозможные варианты этого:

  $record1 = Contactable::firstOrNew(
    [
     'contactable_ID' => $location_ID,
     'user_ID' => $user_ID,
     'contactable_type' => Location::class,
    ]);
  $record = Contactable::find($record1->key_ID);
  $record->fill(
    [
     'active' => $active,
    ]);
  $record->save();
    $primaryKey = 'key_ID';
    $guarded = [];
    $fillable = [
        'user_ID',
        'use_loc_contact_info',
        'contactable_ID',
        'contactable_type',
        'active',
        'flag',
        'print_and_save',
        'marketing',
      ];

Похоже, это происходит только при попытке обновить запись, где я на самом деле что-то изменить. Создание записей, кажется, работает нормально, обновление, где я ничего не меняю, кажется, работает. Я в полной растерянности относительно того, что делать дальше...

Я посмотрел на них (и дюжину + других, которые на самом деле не были связаны):

Метод Laravel eloquent firstOrNew не обновляет и не вставляет

laravel auth:api возвращает SQLSTATE [42S22]: столбец не найден: 1054 неизвестный столбец '' в 'предложении where' (SQL: select * from `users` where ``

Спасибо за любую помощь или новые вопросы!

2 ответа

После изрядного количества осмотров я наконец нашел решение этой проблемы, основанное на этой проблеме, с которой я наткнулся. Я забыл, что в этой таблице есть составной ключ, который послужил источником этой проблемы.

Я включил это в свою настраиваемую модель поворота, чтобы переопределить значение по умолчанию laravel для "setKeysForSaveQuery":

class Contactable extends MorphPivot {...
    защищенная функция setKeysForSaveQuery (Builder $query) {
        $ запрос
            // Введите здесь соответствующие значения для ключей:
            -> где ('contactable_type', '=', $ this-> contactable_type)
            -> где ('contactable_ID', '=', $ this-> contactable_ID)
            -> где ('user_ID', '=', $ this-> user_ID);

        return $query;
    }...
}

это сработало как шарм и устранило проблему, которая приводила к красноречивому созданию ...where '' is null and 'key_ID' = 235852 запрос

Я также сослался на следующее, что послужило основой для моего решения, но в основном не решало мою слишком сложную проблему составного ключа на настраиваемой полиморфной связи. Надеюсь, этот путь поможет кому-то другому.

Метод Laravel eloquent firstOrNew не обновляет и не вставляет

Создание и обновление Laravel Eloquent

https://github.com/laravel/framework/issues/2393

https://github.com/laravel/framework/issues/5355

Обновление модели Laravel с двумя первичными ключами

https://laravel.com/docs/5.7/migrations

Как я могу поместить составные ключи в модели в Laravel 5?

https://blog.maqe.com/solved-eloquent-doesnt-support-composite-primary-keys-62b740120f

https://www.reddit.com/r/laravel/comments/alrgwk/composite_key_in_table_only/

Я использовал это исправление в Laravel 5.4, очень похоже на предыдущий ответ Кевина Фостера и взято из https://github.com/laravel/framework/issues/5517

Вставьте это в свою модель Laravel для рассматриваемой таблицы - вставьте имена столбцов для составного ключа вместо column1 и column2

Моя проблема решена - спасибо предыдущему участнику

      /**
 * Set the keys for a save update query.
 * This is a fix for tables with composite keys
 * TODO: Investigate this later on
 *
 * @param  \Illuminate\Database\Eloquent\Builder  $query
 * @return \Illuminate\Database\Eloquent\Builder
 */
protected function setKeysForSaveQuery(Builder $query)
{
    $query
        //Put appropriate values for your keys here:
        ->where('column1', '=', $this->column1)
        ->where('column2', '=', $this->column2);

    return $query;
}

Вам также нужно будет включить:

      use \Illuminate\Database\Eloquent\Builder;
Другие вопросы по тегам