Question

Je aime vraiment Active Record de CodeIgniter et comment bien il permet à toutes mes requêtes de base de données nécessaires.

Mais j'ai aussi lu sur ORM comme Doctrine. Quand je lis la documentation de la doctrine, il ne semble pas aussi clair à utiliser comme Active Record, et je ne peux pas voir ce qui en fait mieux (si elle est).

Qu'est-ce que la doctrine permet cela est impossible avec Active Record? Est-ce que la doctrine font le même travail plus rapide, plus facile, mieux? Ou faut-il faire des choses active Record ne peut le faire?

Le mieux serait si les gens pouvaient poster des exemples de tâches montrant ce dont nous parlons.

Merci, Matthew

Était-ce utile?

La solution

Doctrine est un ORM à part entière qui met en œuvre le modèle d'enregistrement actif. classe d'enregistrement actif de CodeIgniter est un wrapper générateur de requêtes / base de données qui est basée sur une version « modifiée » du motif.

Disclaimer: Je ne l'ai jamais utilisé la doctrine. Je vais essayer de mon mieux pour illustrer les différences entre la mise en œuvre des dossiers actifs de CodeIgniter et de la doctrine, basée sur ma compréhension.

En utilisant la classe d'enregistrement actif de CodeIgniter, vous pourriez mettre en œuvre un modèle comme celui-ci:

class User_model extends CI_Model
{

    public function get_user_by_username($username)
    {
        // Build query using active record methods
        $this->db->where('username', $username);
        $this->db->where('active', 1);

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

        // Return results
        return $query->result();
    }

    // ...

}

Vous construisez essentiellement la requête en utilisant les méthodes d'enregistrement actif. Il est facile de voir comment chaque méthode (where(), get(), etc.) cartes à SQL brutes. L'avantage d'utiliser les méthodes d'enregistrement actif par opposition à un $this->db->query() est que CodeIgniter compile chaque requête basée sur le pilote de base de données que vous utilisez. A part cela, la mise en œuvre d'enregistrement actif CodeIgniter n'a pas vraiment grand-chose. Pour toute question, vous avez besoin, vous devrez créer. J'espère avoir montré comment les méthodes d'enregistrement actif sont similaires à un générateur de requêtes.

Notez que que le code exemple suivant peut être incorrect. En utilisant Doctrine, vous pourriez avoir un modèle comme celui-ci:

/** @Entity */
class User
{

    /** @Column(type="integer") */
    private $id;

    /** @Column(length=50) */
    private $username;

    // ...

}

Ensuite, utiliser le modèle et la fonctionnalité d'enregistrement actif associé, vous feriez quelque chose comme ceci:

// Instantiate object
$user = new User();

// Set properties
$user->username = 'some_username';

// Save object
$user->save();

// Access properties
echo $user->id;

Ceci est qu'effleurer la surface en termes de ce que la doctrine peut faire. Vous pouvez définir des valeurs par défaut des propriétés ou spécifier des relations entre les tables. Remarquez que je n'ai pas écrit tout SQL ou construire la requête. Je viens de définir les propriétés de l'objet puis enregistré. Doctrine prend en charge le reste.

Notez que la doctrine comprend son propre générateur de requêtes, d'une manière il fait ce dossier actif de CodeIgniter fait, et plus encore.

Utilisation Doctrine est similaire à CakePHP ou Ruby on Rails de la mise en œuvre du modèle d'enregistrement actif. Vous pouvez jeter un oeil là pour des informations supplémentaires sur le modèle. Les exemples de CakePHP pourraient être particulièrement facile à digérer si vous venez d'un milieu CodeIgniter.

Pour répondre à certaines de vos questions, je ne pense pas qu'il y ait tout ce qui rend la doctrine mieux que les méthodes d'enregistrement actif CodeIgniter. Il peut être plus avancé, mais comme toute autre bibliothèque, vous voulez choisir le meilleur outil pour le travail. Si vous êtes satisfait des méthodes d'enregistrement actif de CodeIgniter et vous ne voyez pas besoin d'un ORM avancé, passez-le.

Autres conseils

D'abord, quelle doctrine que tu racontes, 1 ou 2
Il ya une énorme différence. La seule chose que les deux ont en commun est qu'ils sont tous les deux à part entière ORM-s. Sinon, il n'y a pas vraiment de lien entre les deux.

Doctrine 1 est basée sur ActiveRecords , Doctrine 2 est basée sur Data Mapper modèle.
Les deux peuvent faire mêmes choses, mais il y a des différences significatives entre les deux.

D'une manière générale Data Mapper est moins « facile à développeur » mais devrait avoir une meilleure performance. Pourquoi? En fait, il est assez simple. Avec les dossiers actifs de chaque entité sait tout « autour » lui-même, la relation avec d'autres entités, etc. Avec mappeur de données, les entités sont muets et léger, il y a une entité centrale (EntityManager / UnitOfWork dans Doctrine2) qui gère toutes les cartographie de relation. Donc, en termes d'utilisation de la mémoire et les performances mappeur de données devrait être plus rapide.
Les gars disent que Doctrine Doctrine2 est moins 50% plus rapide que Doctrine1 (il y a d'autres différences, pas seulement le design pattern).

Si vous vous sentez pour elle, vous pouvez même mettre en œuvre ActiveRecords plus datamapper Doctrine2. Regardez cette billet de blog . J'utilise cette approche juste pour la phase de développement, de garder le moins de code possible. Une fois qu'il pénètre dans la production, je vais tuer la couche de ActiveRecords supplémentaire et rollback aux données par défaut mappeur de Doctrine2.

Donc, la conclusion est que vous pouvez tout faire à la fois, mais de la même manière que vous pourriez dire que vous pouvez tout faire avec SQL brut. Si vous êtes un débutant dans le monde ORM, je suggère d'aller avec ActiveRecords, car il est simple et (généralement) nécessite moins de code. D'autre part, si vous construisez un grand modèle complexe, je pense que les données mappeur est l'option meilleure.

Peut-être que je suis quelque chose de mal, mais c'est la façon dont je l'ai compris.

En ce qui concerne la comparaison entre CodeIgniters ActiveRecords et Doctrine (1 ou 2), je ne peux pas vraiment dire, parce que je jamais utilisé CodeIgniter. Une chose que je suis sûr, la doctrine a beaucoup plus de fonctionnalités que CodeIgniters défaut ORM. Par exemple: l'hydratation du résultat, l'héritage (seule table, table de classe), préchargement, le chargement paresseux, le chargement paresseux supplémentaires, les extensions, les comportements, l'optimisation, les proxies, datetime manutention ... Il est un ORM à part entière massive et avec beaucoup de caractéristiques, alors que mon expérience avec un « cadre par défaut ORM » est que leur objectif principal est d'être simple que possible, de sorte qu'un débutant peut obtenir un coup de très facilement. Doctrine est une bête puissante et sûre peut faire beaucoup de choses dans une plus efficace et / ou une façon logiquement plus correct que la construction dans CodeIgniter ORM. L'inconvénient est qu'il faut plus de temps pour apprendre et code, et il est une grande bibliothèque, avec des milliers de fichiers, donc juste pour obtenir tout ce que la course ajoute certains frais généraux par rapport à une alternative plus légère.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top