2012-05-11 5 views
3

Я создаю объект модели следующим образом: $ object1 = new Object1(); Существует таблица в базе данных с именем object1s. Класс Object1 является пустым классом, который расширяет DataMapper. Это работает без проблем. Я могу сохранять данные и извлекать данные из базы данных (я вижу это с помощью отдельного клиента базы данных).CodeIgniter DataMapper ORM не удалось создать экземпляр объекта модели

Я попытался сделать то же самое с другим объектом (и другой таблицей), например, $ object2 = new Object2(); На этот раз я получаю следующее сообщение об ошибке:

Fatal error: Call to a member function line() on a non-object in /Applications/XAMPP/xamppfiles/htdocs/c/application/libraries/Datamapper.php on line 6049

Line 6049 выглядит следующим образом:

return $this->lang->line($key);

Когда я инстанцирован Object1, $ this-> Ланг был установлен на экземпляр DM_Lang в этой точке, но при создании экземпляра второго объекта $ this-> lang устанавливается значение "en". Единственное различие между ними - это имя и таблица базы данных.

Что можно сделать, чтобы исправить это? Почему они разные? Где устанавливается $ this-> lang (я уже прошел через отладчик и не могу его найти)?

База данных - это MySQL. Я запускаю это для разработки на MacOSX Lion. Веб-сервер - это apache. Я использую DataMapper ORM v1.8.2.


Был комментарий с точным кодом, о котором идет речь. Это полный точный код, который я тестировал с помощью (я скопировал и вставил из каждого файла).

Object1 называется фильм, модели/movie.php:

<?php 

class Movie extends DataMapper { 

} 

Объект 2 называется изображение, модели/image.php:

<?php 

class Image extends DataMapper { 

} 

Контроллер выглядит следующим образом, контроллеры/тест .php:

<?php 

class Test extends CI_Controller { 

    public function newdata() 
    { 
     // The following line runs as expected 
     $movie = new Movie(); 
     // The following line fails with the Fatal error mentioned above 
     $image = new Image(); 

    } 

} 

I следуя инструкциям по установке, которые поставляются с DataMapper v1.8.2. Мой файл index.php включает следующее, прежде чем загружать файл начальной загрузки CodeIgniter.

/* -------------------------------------------------------------------- 
* LOAD THE DATAMAPPER BOOTSTRAP FILE 
* -------------------------------------------------------------------- 
*/ 
     require_once APPPATH.'third_party/datamapper/bootstrap.php'; 

Он работает совершенно плавно с объектом Кино. Я могу записать в него данные и убедиться, что он существует с помощью отдельного инструмента запросов SQL.

Я просто заметил, что строка «$ image = ...» работает без ошибок, если строка «$ movie = ...» закомментирована. Тем не менее, мне нужно, чтобы оба из них работали нормально.

Я использую CI_VERSION = 2.1.0.

Благодарим за помощь.

+0

Я только что нашел проблему. Первая таблица имела конфликт имен (он использовал «lang» для имени поля). Вторая таблица не имела конфликтов и была неудачной только потому, что это был следующий экземпляр подкласса DataMapper, который появился после объекта с проблемой. Мое внимание было обращено на таблицу/модель, которая терпела неудачу, когда на самом деле это был тот, который преуспел в этой проблеме. – mdl

+1

Ага, я вижу - вы переписали одно из [зарезервированных имен] (http://datamapper.wanwizard.eu/pages/reservednames.html). Я бы сказал, стоит ли автоответчику. –

ответ

2

Схема базы данных использовалась до переключения на CodeIgniter. Первая таблица имела конфликт имен (он использовал «lang» для имени поля). Вторая таблица не имела конфликтов и была неудачной только потому, что это был следующий экземпляр подкласса DataMapper, который появился после объекта модели с проблемой. Мое внимание было обращено на таблицу/модель, которая терпела неудачу, когда на самом деле это была та, которая преуспела в этом.

Исправление состоит в том, чтобы проверять ВСЕ объекты модели на наличие конфликтов, а не только на то, что происходит с ошибкой.

+1

Ничего себе. Реквизит по отладке. У меня тоже была колонка «lang» ... если бы я не нашел этого, я бы искал целую вечность! Спасибо! –