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

#php #codeigniter-4

#php #codeigniter-4

Вопрос:

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

 <?php namespace AppModels;

use CodeIgniterModel;

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 AppControllers;

use AppModelscodigofacilito_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);
  }

}

  

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

Комментарии:

1. Убедитесь, что вы не используете магический метод __construct в своих контроллерах. Вместо этого используйте метод initController, предоставленный в вашем BaseController.

Ответ №1:

Поскольку в ошибке указано deleted_at , что в вашей cursos таблице отсутствует столбец.

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

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

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

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

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

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