Модели и свойства CodeIgniter - PullRequest
3 голосов
/ 22 февраля 2012

У меня есть вопрос, касающийся свойств для конкретного экземпляра модели CI. Например:

Существует модель под названием project_model. В модели есть метод calle Get_Projects:

$total_projects = $this->project_model->Get_Projects($options);

Когда это вызывается, оно создает свойство в модели следующим образом:

$query = $this->db->get('projects');//query

$this->num_rows = $query->num_rows();

return $query->result();

Поэтому после вызова метода и в контроллере мне нужно получить доступ к num_rows:

$num_rows = $total_projects->num_rows;

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

Моя проблема в том, что это создает синтаксическую ошибку:

Severity: Notice
Message: Trying to get property of non-object
Filename: controllers/projects.php
Line Number: 110 ($num_rows = $total_projects->num_rows;)

Во-первых, почему это? Я думал об использовании этого: $ this-> project_model :: num_rows вместо? Но тогда num_rows не будут специфичными для объекта $ total_rows, не так ли? Так будет только для всей модели.

Кстати: я читал руководство по CI для моделей, но не было никакой информации о создании экземпляров моделей вообще.

РЕДАКТИРОВАНИЕ: мне нужно, чтобы результат свойства num_rows был специфичным для объекта. Так, например:

$a=$this->project_model->Get_Projects($options);
$b=$this->project_model->Get_Projects($options);
$num_rows = $this->project_model->num_rows;

Последняя строка получит результат $ b num_rows, а не $ a. Итак, как мне это назвать, чтобы я мог сделать его специфичным для объекта? (Очевидно, я мог бы сохранить его перед вторым вызовом в переменной.)

Ответы [ 4 ]

2 голосов
/ 22 февраля 2012

Это происходит потому, что ваша переменная $total_projects не имеет экземпляра класса.Он просто содержит результаты функции Get_Projects().

Вы должны попытаться после всего сделать $num_rows = $this->project_model->num_rows (не проверено)

1 голос
/ 22 февраля 2012

Вы можете просто создавать экземпляр модели каждый раз, когда вам это нужно.

$object_one = new $this->project_model;
$foo = $object_one->Get_Projects($options);
var_dump($foo);
echo $object_one->num_rows;

$object_two = new $this->project_model;
$bar = $object_two->Get_Projects($options);
var_dump($bar);
echo $object_two->num_rows;

Таким образом, вы можете получить / установить любые атрибуты каждого экземпляра модели отдельно.

1 голос
/ 22 февраля 2012

Лучше сделать два запроса.

Один для num строк и другой для результата.

Вы возвращаете только результат, а не количество строк.Так что это не вернет значение.

Сделайте каждый запрос в другой функции.И затем вызов из этой функции.

Хотя я не уверен насчет производительности.

0 голосов
/ 22 февраля 2012
****** Model ****

class Project_model extends .... {

    private $num_rows = 0;
    public function Get_Projects($options){
        .....
        $query = $this->db->get('projects');//query
        $this->num_rows = $query->num_rows();
        return $query->result();
    }

    public get_num_rows(){
        return $this->num_rows;
    }
}

**** Controller ****

class Project extends .... {
    function project(){
        ...
        $total_projects = $this->project_model->Get_Projects($options);
        $num_rows = $this->project_model->get_num_rows();
        ...
    }
}

Не идеальный пример инкапсуляции, но ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...