mysqli_sql_exception неизвестный столбец в codeigniter при использовании findAll()

Я изучаю CodeIgniter4, и я застрял при использовании функции findAll (), она говорит следующее: mysqli_sql_exception # 1054 Неизвестный столбец «cursos.deleted_at» в «где пункт»

<?php namespace App\Models;

use CodeIgniter\Model;

class Codigofacilito_model extends Model
{
  protected $table      = 'cursos';
  protected $primaryKey = 'idCurso';

  protected $returnType     = 'array';
  protected $useSoftDeletes = true;

  protected $allowedFields = ['nombreCurso','videosCurso'];

  protected $useTimestamps = false;
  protected $createdField  = 'created_at';
  protected $updatedField  = 'updated_at';
  protected $deletedField  = 'deleted_at';

  protected $validationRules    = [];
  protected $validationMessages = [];
  protected $skipValidation     = false;

  function __construct()
  {
    if (is_callable('parent::__construct')) {
      parent::__construct();
    }
  }

  function crearCurso($arr)
  {
    $this->insert
    (array(
        'nombreCurso' => $arr['nombre'],
        'videosCurso' => $arr['videos']
      )
    );
  }
}

Контроллер:

<?php namespace App\Controllers;

use App\Models\codigofacilito_model;

class Cursos extends BaseController{
  function __construct(){
    if (is_callable('parent::__construct')) {
      parent::__construct();
    }
    helper('form');
  }

  function index(){
    $modelo1=new Codigofacilito_model($db);
    $data=$modelo1->findAll();
    echo view('codigofacilito/headers');
    echo view('cursos/cursos',$data);
  }

}

Соединение правильное, и все имена таблиц и другие верны.


person devCcori    schedule 10.11.2020    source источник
comment
Не используйте магический метод __construct в своих контроллерах. Вместо этого используйте метод initController, предоставленный в вашем BaseController.   -  person marcogmonteiro    schedule 10.11.2020


Ответы (1)


Как говорит ошибка, вам не хватает столбца deleted_at в таблице cursos.

Здесь вы рассказали Codeigniter две важные вещи:

  • С помощью protected $useSoftDeletes = true; вы говорите ему: Я не хочу использовать оператор удаления SQL, вместо этого обновите поле deleted_at
    Обратите внимание, что deleted_at может быть форматом даты (формат, который вы можете указать с параметром $dateFormat в вашей модели) или INTEGER.
  • С помощью protected $deletedField = 'deleted_at'; вы устанавливаете имя поля, которое будет использоваться при обратимом удалении.

Ваша ошибка улавливается при вызове метода findAll(), поскольку фреймворк будет фильтровать записи на те, которые не подлежат обратимому удалению, используя имя поля, которое вы ему предоставили.

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

Для получения дополнительной информации о конфигурации модели CI4: https://codeigniter.com/user_guide/models/model.html#configuring-your-model

Кроме того, поскольку у вас есть $useTimestamps = false, вам не нужно устанавливать имя для created_at и updated_at.

person ViLar    schedule 10.11.2020