Как использовать собственный сеттер / геттер с Idiorm/Paris?

У меня есть модель (класс php) и таблица в моей базе данных. Когда я пытаюсь find_many без предложения where он находит все записи базы данных. И это создает модель для каждой записи базы данных. Но эти модели пусты и у них нет назначенных данных, потому что у меня есть собственный установщик / получатель для моей модели.

<?php

class City extends Model {

    private $id;
    private $idOwm;
    private $idBla;
    private $name;
    private $longitude;
    private $latitude;
    private $country;

    public function data() {
        return $this->has_many('Data', 'idCity');
    }

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getIdOwm() {
        return $this->idOwm;
    }

    public function setIdOwm($idOwm) {
        $this->idOwm = $idOwm;
    }

    public function getIdBla() {
        return $this->idBla;
    }

    public function setIdBla($idBla) {
        $this->idBla = $idBla;
    }

    public function getName() {
        return $this->name;
    }

    public function setName($name) {
        $this->name = $name;
    }

    public function getLongitude() {
        return $this->longitude;
    }

    public function setLongitude($longitude) {
        $this->longitude = $longitude;
    }

    public function getLatitude() {
        return $this->latitude;
    }

    public function setLatitude($latitude) {
        $this->latitude = $latitude;
    }

    public function getCountry() {
        return $this->country;
    }

    public function setCountry($country) {
        $this->country = $country;
    }
}

$cities = Model::factory('City')->find_many();

$cities массив со многими моделями типа City,

City Object
(
    [id:protected] => 
    [idOwm:protected] => 
    [idBla:protected] => 
    [name:protected] => 
    [longitude:protected] => 
    [latitude:protected] => 
    [country:protected] => 
    [orm] => ORM Object
        (
            [_connection_name:protected] => default
            [_table_name:protected] => city
            [_table_alias:protected] => 
            [_values:protected] => Array
                (
                )

            [_result_columns:protected] => Array
                (
                    [0] => *
                )

            [_using_default_result_columns:protected] => 1
            [_join_sources:protected] => Array
                (
                )

            [_distinct:protected] => 
            [_is_raw_query:protected] => 
            [_raw_query:protected] => 
            [_raw_parameters:protected] => Array
                (
                )

            [_where_conditions:protected] => Array
                (
                )

            [_limit:protected] => 
            [_offset:protected] => 
            [_order_by:protected] => Array
                (
                )

            [_group_by:protected] => Array
                (
                )

            [_having_conditions:protected] => Array
                (
                )

            [_data:protected] => Array
                (
                    [id] => 1
                    [idOwm] => 2950159
                    [idBla] => 0
                    [name] => Berlin
                    [latitude] => 52.52
                    [longitude] => 13.41
                    [country] => DE
                )

            [_dirty_fields:protected] => Array
                (
                )

            [_expr_fields:protected] => Array
                (
                )

            [_is_new:protected] => 
            [_instance_id_column:protected] => id
        )

)

Как я могу использовать свой собственный сеттер / геттер с Idiorm/Paris? Возможно ли это, или мне придется делать какую-то модельную логику по-другому?

2 ответа

Вы не можете сделать это, так как Идиорм полагается на __set() а также __get() магические методы - если вы включите правильные свойства класса с тем же именем, то к этим магическим методам никогда не будет доступа. См. Ссылку на документацию по PHP для более подробной информации по этому вопросу.

Чтобы заставить вашу IDE работать, вы, вероятно, можете использовать PHPDoc @property ссылка на документацию комментариев, которая предназначена для этой цели. На самом деле я не использую PHPStorm, но из того, что я вижу в его документации, он понимает комментарии PHPDoc и может использовать их для понимания структуры кода.

Итак, ваш код будет выглядеть так:

/**
 * @property int $id
 * @property int $idOwm
 * @property int $idBla
 * @property string $name
 * @property string $longitude
 * @property string $latitude
 * @property string $country
 */
class City extends Model {

    public function data() {
        return $this->has_many('Data', 'idCity');
    }

    public function getId() {
        return $this->id;
    }

    ...
}

Этот другой вопрос и ответ о стекопотоке предполагает, что это будет работать в Netbeans: /questions/22111337/kak-opredelit-polya-modeli-s-pomoschyu-idiormgranada-ne-narushaya-funktsionalnost-orm/22111346#22111346

Как только я удаляю свои закрытые / защищенные переменные класса наверху моих моделей, это работает.

<?php

class City extends Model {

    public function data() {
        return $this->has_many('Data', 'idCity');
    }

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getIdOwm() {
        return $this->idOwm;
    }

    public function setIdOwm($idOwm) {
        $this->idOwm = $idOwm;
    }

    public function getIdBla() {
        return $this->idBla;
    }

    public function setIdBla($idBla) {
        $this->idBla = $idBla;
    }

    public function getName() {
        return $this->name;
    }

    public function setName($name) {
        $this->name = $name;
    }

    public function getLongitude() {
        return $this->longitude;
    }

    public function setLongitude($longitude) {
        $this->longitude = $longitude;
    }

    public function getLatitude() {
        return $this->latitude;
    }

    public function setLatitude($latitude) {
        $this->latitude = $latitude;
    }

    public function getCountry() {
        return $this->country;
    }

    public function setCountry($country) {
        $this->country = $country;
    }
}

$cities = Model::factory('City')->find_many();

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

Другие вопросы по тегам