SlideShare a Scribd company logo
#sflive2010




               Doctrine 2
             Not the same Old PHP ORM



Doctrine 2     www.doctrine-project.org   www.sensiolabs.com
#sflive2010




    What is different in Doctrine 2?




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010




             New code, new concepts,
                different workflow




Doctrine 2    www.doctrine-project.org   www.sensiolabs.com
#sflive2010




       100% re-written codebase for
                PHP 5.3




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010




                         Are you scared?




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010




         You shouldn’t be! It is a very
          exciting thing for PHP and
           change is a good thing!



Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010




We learned lots building Doctrine
 1 and we used that to help us
        build Doctrine 2



Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010




               Let me tell you why!




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Performance of Doctrine 1



                     To hydrate 5000 records
                       in Doctrine 1 it takes
                      roughly 4.3 seconds.




Doctrine 2     www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Performance of Doctrine 2



                Under Doctrine 2, hydrating
              those same 5000 records only
                    takes 1.4 seconds.




Doctrine 2     www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Performance of Doctrine 2


              ...and with 10000 records it still
               only takes about 3.5 seconds.

               Twice the data and still faster
                      than Doctrine 1



Doctrine 2     www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Performance of Doctrine 2
• More interesting than the numbers
  themselves is the percentage improvement
  over Doctrine 1




Doctrine 2     www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                         Why is it faster?
• PHP 5.3 gives us a huge performance
  improvement when using a heavily OO
  framework like Doctrine
• Better optimized hydration algorithm
• New query and result caching
  implementations
• All around more explicit and less magical
  code results in better and faster code.
• Killed the magical aspect of Doctrine 1


Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                 Why kill the magic?
• Eliminate the WTF? factor of Doctrine 1




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010




             The Doctrine 1 magical
               features are both a
              blessing and a curse

Doctrine 2     www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Blessing and a Curse
• Magic is great when it works
• The magic you love is also the cause of all
  the pain you’ve felt with Doctrine 1
• When it doesn’t work it is hard to debug
• Edge cases are hard to fix
• Edge cases are hard to work around
• Edge cases, edge cases, edge cases
• Everything is okay until you try and go
  outside the box the magic provides
• ...magic is slow
Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

    How will we replace the magic?
      This new thing called OOP :)

•    Object Composition
•    Inheritance
•    Aggregation
•    Containment
•    Encapsulation
•    ...etc


Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

   Will Doctrine 2 have behaviors?




                             Yes and No



Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                        The No
• We won’t have any concept of “model
  behaviors”

• Behaviors were a made up concept for
  Doctrine 1 to work with its extremely
  intrusive architecture.

• It tries to do things that PHP does not allow
  and is the result of lots of problems in
  Doctrine 1
Doctrine 2   www.doctrine-project.org      www.sensiolabs.com
#sflive2010

                                        The Yes
• Everything you can do in Doctrine 1 you can
  do in Doctrine 2, just in a different way.

• “Behavior” like functionality will be bundled
  as extensions for Doctrine 2 and will just
  contain normal OO PHP code that wraps/
  extends Doctrine code or is meant to be
  wrapped or extended by your entities.



Doctrine 2   www.doctrine-project.org       www.sensiolabs.com
#sflive2010




             What did we use to build
                   Doctrine 2?




Doctrine 2    www.doctrine-project.org   www.sensiolabs.com
#sflive2010

               Doctrine 2 Tool Belt
•    phpUnit 3.4.10 - Unit Testing
•    Phing - Packaging and Distribution
•    Symfony YAML Component
•    Sismo - Continuous Integration
•    Subversion - Source Control
•    Jira - Issue Tracking and Management
•    Trac - Subversion Timeline, Source Code
     Browser, Changeset Viewer


Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Doctrine 2 Architecture
• Entities
• Lightweight persistent domain object
• Regular PHP class
• Does not extend any base Doctrine class
• Cannot be final or contain final methods
• Any two entities in a hierarchy of classes must not have a
  mapped property with the same name
• Supports inheritance, polymorphic associations and
  polymorphic queries.
• Both abstract and concrete classes can be entities
• Entities may extend non-entity classes as well as entity
  classes, and non-entity classes may extend entity classes


Doctrine 2    www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Doctrine 2 Architecture
• Your entities in Doctrine 2 don’t require
  that you extend a base class like in Doctrine
  1! No more imposing on your domain
  model!
                                namespace Entities;

                                class User
                                {
                                    private $id;
                                    private $name;
                                    private $address;
                                }

Doctrine 2    www.doctrine-project.org     www.sensiolabs.com
#sflive2010

             Doctrine 2 Architecture
• The EntityManager
• Central access point to the ORM functionality provided by
  Doctrine 2. API is used to manage the persistence of your
  objects and to query for persistent objects.
• Employes transactional write behind strategy that delays the
  execution of SQL statements in order to execute them in the
  most efficient way
• Execute at end of transaction so that all write locks are quickly
  releases
• Internally an EntityManager uses a UnitOfWork to keep track
  of your objects




Doctrine 2    www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                 Unit Testing
• Tests are ran against multiple DBMS types.
  This is something that was not possible
  with the Doctrine 1 test suite.

•    ...Sqlite
•    ...MySQL
•    ...Oracle
•    ...PgSQL
•    ...more to come

Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                 Unit Testing
• 859 Test Cases
• 2152 Assertions
• Tests run in a few seconds compared to
  30-40 seconds for Doctrine 1
• Much more granular and explicit unit tests
• Easier to debug failed tests
• Continuously integrated by Sismo :)




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                         Sismo
      – No, Sismo is not available yet!!!!!!!!! :)
      – Want it? Bug Fabien!




Doctrine 2    www.doctrine-project.org      www.sensiolabs.com
#sflive2010

             Database Abstraction Layer
• Separate standalone package and
  namespace (DoctrineDBAL).

• Can be used standalone.

• Much improved over Doctrine 1 in regards
  to the API for database introspection and
  schema management.



Doctrine 2     www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Database Abstraction Layer
• Hopefully Doctrine 2 DBAL can be the
  defacto standard DBAL for PHP 5.3 in the
  future like MDB and MDB2 were in PEAR

• Maybe we can make this happen for PEAR2?




Doctrine 2     www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                DBAL Data API
•    prepare($sql) - Prepare a given sql statement and return the DoctrineDBAL
     DriverStatement instance.
•    executeUpdate($sql, array $params) - Executes a prepared statement with the
     given sql and parameters and returns the affected rows count.
•    execute($sql, array $params) - Creates a prepared statement for the given sql and
     passes the parameters to the execute method, then returning the statement.
•    fetchAll($sql, array $params) - Execute the query and fetch all results into an array.
•    fetchArray($sql, array $params) - Numeric index retrieval of first result row of the
     given query.
•    fetchBoth($sql, array $params) - Both numeric and assoc column name retrieval of
     the first result row.
•    fetchColumn($sql, array $params, $colnum) - Retrieve only the given column of
     the first result row.
•    fetchRow($sql, array $params) - Retrieve assoc row of the first result row.
•    select($sql, $limit, $offset) - Modify the given query with a limit clause.
•    delete($tableName, array $identifier) - Delete all rows of a table matching the
     given identifier, where keys are column names.
•    insert($tableName, array $data) - Insert a row into the given table name using the

Doctrine 2       www.doctrine-project.org        www.sensiolabs.com
#sflive2010

             DBAL Introspection API
•    listDatabases()
•    listFunctions()
•    listSequences()
•    listTableColumns($tableName)
•    listTableConstraints($tableName)
•    listTableDetails($tableName)
•    listTableForeignKeys($tableName)
•    listTableIndexes($tableName)
•    listTables()
Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

        DBAL Schema Representation
$schema = new DoctrineDBALSchemaSchema();
$myTable = $schema->createTable("my_table");
$myTable->createColumn("id", "integer", array("unsigned" => true));
$myTable->createColumn("username", "string", array("length" => 32));
$myTable->setPrimaryKey(array("id"));
$myTable->addUniqueIndex(array("username"));
$schema->createSequence("my_table_seq");

$myForeign = $schema->createTable("my_foreign");
$myForeign->createColumn("id", "integer");
$myForeign->createColumn("user_id", "integer");
$myForeign->addForeignKeyConstraint($myTable, array("user_id"),
array("id"), array("onUpdate" => "CASCADE"));

$queries = $schema->toSql($myPlatform); // get queries to create this
schema.
$dropSchema = $schema->toDropSql($myPlatform); // get queries to
safely delete this schema.

Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                Compare DBAL Schemas


             $comparator = new DoctrineDBALSchemaComparator();
             $schemaDiff = $comparator->compare($fromSchema, $toSchema);

             // queries to get from one to another schema.
             $queries = $schemaDiff->toSql($myPlatform);
             $saveQueries = $schemaDiff->toSaveSql($myPlatform);




Doctrine 2         www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Schema Management
• Extracted from ORM to DBAL

• Schema comparisons replace the migrations
  diff tool of Doctrine 1




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Doctrine 2 Annotations
                    <?php

                    namespace Entities;

                    /**
                      * @Entity @Table(name="users")
                      */
                    class User
                    {
                         /** @Id @Column(type="integer") @GeneratedValue */
                         private $id;

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

                          /** @OneToOne(targetEntity="Address") */
                          private $address;
                    }




Doctrine 2   www.doctrine-project.org                 www.sensiolabs.com
#sflive2010

                       Things to Notice
• Entities no longer require you to extend a
  base class!
• Your domain model has absolutely no
  magic, is not imposed on by Doctrine and is
  defined by raw PHP objects and normal OO
  programming.
• The performance improvement from this is
  significant.
• Easier to understand what is happening due
  to less magic occurring. As Fabien says,
  “Kill the magic...”
Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                       Doctrine 2 YAML
                                    EntitiesAddress:
                                      type: entity
                                      table: addresses
                                      id:
                                        id:
                                          type: integer
                                          generator:
                                            strategy: AUTO
                                      fields:
                                        street:
                                          type: string
                                          length: 255
                                      oneToOne:
                                        user:
                                          targetEntity: User
                                          mappedBy: address



Doctrine 2   www.doctrine-project.org            www.sensiolabs.com
#sflive2010

                              Doctrine 2 XML
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                    http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">

     <entity name="EntitiesUser" table="users">
         <id name="id" type="integer">
             <generator strategy="AUTO"/>
         </id>
         <field name="name" type="string" length="50"/>
         <one-to-one field="address" target-entity="Address">
             <join-column name="address_id" referenced-column-name="id"/>
         </one-to-one>
     </entity>

</doctrine-mapping>




Doctrine 2       www.doctrine-project.org       www.sensiolabs.com
#sflive2010

                       Doctrine 2 Setup
• PHP “use” all necessary namespaces and
  classes

             use DoctrineCommonClassLoader,
                 DoctrineORMConfiguration,
                 DoctrineORMEntityManager,
                 DoctrineCommonCacheApcCache,
                 EntitiesUser, EntitiesAddress;




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                       Doctrine 2 Setup
• Require the Doctrine ClassLoader



 require '../../lib/Doctrine/Common/ClassLoader.php';




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                       Doctrine 2 Setup
• Setup autoloading for Doctrine classes
• ...core classes
• ...entity classes
• ...proxy classes

$doctrineClassLoader = new ClassLoader('Doctrine', '/path/to/doctrine');
$doctrineClassLoader->register();

$entitiesClassLoader = new ClassLoader('Entities', '/path/to/entities');
$entitiesClassLoader->register();

$proxiesClassLoader = new ClassLoader('Proxies', '/path/to/proxies');
$proxiesClassLoader->register();



Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                       Doctrine 2 Setup
• Configure your Doctrine implementation

               // Set up caches
               $config = new Configuration;
               $cache = new ApcCache;
               $config->setMetadataCacheImpl($cache);
               $config->setQueryCacheImpl($cache);

               // Proxy configuration
               $config->setProxyDir('/path/to/proxies/Proxies');
               $config->setProxyNamespace('Proxies');




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                            Doctrine 2 Setup
• Create your database connection and entity
  manager

             // Database connection information
             $connectionOptions = array(
                 'driver' => 'pdo_sqlite',
                 'path' => 'database.sqlite'
             );

             // Create EntityManager
             $em = EntityManager::create($connectionOptions, $config);




Doctrine 2        www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                       Doctrine 2 Setup
• In production you would lazily load the
  EntityManager
• Example: $em = function()
             {
                                 static $em;
                                 if (!$em)
                                 {
                                   $em = EntityManager::create($connectionOptions, $config);
                                 }
                                 return $em;
                             }


• In the real world I wouldn’t recommend that
  you use the above example
• Symfony DI would take care of this for us

Doctrine 2   www.doctrine-project.org               www.sensiolabs.com
#sflive2010

                       Doctrine 2 Setup
• Now you can start using your models and
  persisting entities


             $user = new User;
             $user->setName('Jonathan H. Wage');
             $em->persist($user);
             $em->flush();




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                   Insert Performance
• Inserting 20 records with Doctrine

             for ($i = 0; $i < 20; ++$i) {
                 $user = new User;
                 $user->name = 'Jonathan H. Wage';
                 $em->persist($user);
             }

             $s = microtime(true);
             $em->flush();
             $e = microtime(true);
             echo $e - $s;


Doctrine 2    www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                  Insert Performance
• Compare it to some raw PHP code


$s = microtime(true);
for ($i = 0; $i < 20; ++$i) {
    mysql_query("INSERT INTO users (name) VALUES ('Jonathan H. Wage')",
$link);
}
$e = microtime(true);
echo $e - $s;




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                  Insert Performance
• The results might be surprising to you.
  Which do you think is faster?




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                  Insert Performance



             Doctrine 2                 0.0094 seconds

             mysql_query 0.0165 seconds




Doctrine 2   www.doctrine-project.org    www.sensiolabs.com
#sflive2010

                  Insert Performance
• Doctrine 2 is faster than some raw PHP
  code? What?!?!?! HUH?
• It does a lot less, provides no features, no
  abstraction, etc.

• Why? The answer is transactions! Doctrine 2
  manages our transactions for us and
  efficiently executes all inserts in a single,
  short transaction. The raw PHP code
  executes 1 transaction for each insert.

Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                  Insert Performance
• Here is the same raw PHP code re-visited
  with proper transaction usage.

$s = microtime(true);
mysql_query('START TRANSACTION', $link);
for ($i = 0; $i < 20; ++$i) {
    mysql_query("INSERT INTO users (name) VALUES ('Jonathan H. Wage')",
$link);
}
mysql_query('COMMIT', $link);
$e = microtime(true);
echo $e - $s;




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                  Insert Performance
• Not trying to say Doctrine 2 is faster than
  raw PHP code

• Demonstrating that simple developer
  oversights and mis-use can cause the
  greatest performance problems




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                   Insert Performance
• This time around it only takes 0.0028
  seconds compared to the previous 0.0165
  seconds. That’s a pretty huge improvement.

• You can read more about this on the
  Doctrine Blog

     http://www.doctrine-project.org/blog/transactions-and-performance




Doctrine 2    www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Doctrine Query Language
• DQL parser completely re-written from
  scratch

• ...DQL is parsed by a top down recursive
  descent parser that constructs an AST
  (abstract syntax tree).

• ...The AST is used to generate the SQL to
  execute for your DBMS
               http://www.doctrine-project.org/documentation/manual/2_0/en/dql-doctrine-query-language


Doctrine 2    www.doctrine-project.org                       www.sensiolabs.com
#sflive2010

             Doctrine Query Language
• Here is an example DQL query



        $q = $em->createQuery('select u from MyProjectModelUser u');
        $users = $q->execute();




Doctrine 2      www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Doctrine Query Language
• Here is that same DQL query using the
  QueryBuilder API

             $qb = $em->createQueryBuilder()
                 ->select('u')
                 ->from('MyProjectModelUser', 'u');

             $q = $qb->getQuery();
             $users = $q->execute();


                         http://www.doctrine-project.org/documentation/manual/2_0/en/query-builder




Doctrine 2      www.doctrine-project.org                        www.sensiolabs.com
#sflive2010

             Doctrine Query Builder
• QueryBuilder API is the same as
  Doctrine_Query API in Doctrine 1
• Query building and query execution are
  separated
• True builder pattern used
• QueryBuilder is used to build instances of
  Query
• You don’t execute a QueryBuilder, you get
  the built Query instance from the
  QueryBuilder and execute it
Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                              Cache Drivers
• Public interface of all cache drivers

• fetch($id) - Fetches an entry from the
  cache.
• contains($id) - Test if an entry exists in the
  cache.
• save($id, $data, $lifeTime = false) - Puts
  data into the cache.
• delete($id) - Deletes a cache entry.

Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                              Cache Drivers
• Wrap existing Symfony, ZF, etc. cache driver
  instances with the Doctrine interface




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                              Cache Drivers
• deleteByRegex($regex) - Deletes cache
  entries where the key matches a regular
  expression

• deleteByPrefix($prefix) - Deletes cache
  entries where the key matches a prefix.

• deleteBySuffix($suffix) - Deletes cache
  entries where the key matches a suffix.


Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                              Cache Drivers
• Each driver extends the AbstractCache class
  which defines a few abstract protected
  methods that each of the drivers must
  implement to do the actual work

•    _doFetch($id)
•    _doContains($id)
•    _doSave($id, $data, $lifeTime = false)
•    _doDelete($id)

Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                        APC Cache Driver
• To use the APC cache driver you must have
  it compiled and enabled in your php.ini


             $cacheDriver = new DoctrineCommonCacheApcCache();
             $cacheDriver->save('cache_id', 'my_data');




Doctrine 2      www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                Memcache Cache Driver
• To use the memcache cache driver you
  must have it compiled and enabled in your
  php.ini

             $memcache = new Memcache();
             $memcache->connect('memcache_host', 11211);

             $cacheDriver = new DoctrineCommonCacheMemcacheCache();
             $cacheDriver->setMemcache($memcache);
             $cacheDriver->save('cache_id', 'my_data');




Doctrine 2         www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                   Xcache Cache Driver
• To use the xcache cache driver you must
  have it compiled and enabled in your
  php.ini

             $cacheDriver = new DoctrineCommonCacheXcacheCache();
             $cacheDriver->save('cache_id', 'my_data');




Doctrine 2        www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                       Result Cache
• First you need to configure the result cache
                $cacheDriver = new DoctrineCommonCacheApcCache();
                $config->setResultCacheImpl($cacheDriver);


• Then you can configure each query to use
  the result cache or not.
             $query = $em->createQuery('select u from EntitiesUser u');
             $query->useResultCache(true, 3600, 'my_query_name');


• Executing this query the first time would
  populate a cache entry in $cacheDriver
  named my_query_name
Doctrine 2          www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                 Result Cache
• Now you can clear the cache for that query
  by using the delete() method of the cache
  driver


             $cacheDriver->delete('my_query_name');




Doctrine 2    www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Command Line Interface
• Re-written command line interface to help
  developing with Doctrine




Doctrine 2    www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                dbal:run-sql
• Execute a manually written SQL statement
• Execute multiple SQL statements from a file




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                        orm:clear-cache
•    Clear   all query, result and metadata cache
•    Clear   only query cache
•    Clear   only result cache
•    Clear   only metadata cache
•    Clear   a single queries result cache
•    Clear   keys that match regular expression
•    Clear   keys that match a prefix
•    Clear   keys that match a suffix


Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010




             So now when you have a problem in
             Doctrine, like Symfony, you can try
             clearing the cache first :)




Doctrine 2      www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             orm:convert-mapping
• Convert metadata information between
  formats
• Convert metadata information from an
  existing database to any supported format
  (yml, xml, annotations, etc.)
• Convert mapping information from xml to
  yml or vice versa
• Generate PHP classes from mapping
  information with mutators and accessors


Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

orm:ensure-production-settings
• Verify that Doctrine is properly configured
  for a production environment.

• Throws an exception when environment
  does not meet the production requirements




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             orm:generate-proxies
• Generate the proxy classes for entity
  classes.

• A proxy object is an object that is put in
  place or used instead of the "real" object. A
  proxy object can add behavior to the object
  being proxied without that object being
  aware of it. In Doctrine 2, proxy objects are
  used to realize several features but mainly
  for transparent lazy-loading.

Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                 orm:run-dql
• Execute a DQL query from the command
  line




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                     orm:schema-tool
• Drop, create and update your database
  schema.

• --create option creates the initial tables for
  your schema
• --drop option drops the the tables for your
  schema
• --update option compares your local
  schema information to the database and
  updates it accordingly
Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                    Inheritance
• Doctrine 2 fully supports inheritance. We
  allow the following types of inheritance:

• ...Mapped Superclasses
• ...Single Table Inheritance
• ...Class Table Inheritance




Doctrine 2   www.doctrine-project.org     www.sensiolabs.com
#sflive2010

             Mapped Superclasses
             /** @MappedSuperclass */
             class MappedSuperclassBase
             {
                 /** @Column(type="integer") */
                 private $mapped1;
                 /** @Column(type="string") */
                 private $mapped2;
                 /**
                  * @OneToOne(targetEntity="MappedSuperclassRelated1")
                  * @JoinColumn(name="related1_id", referencedColumnName="id")
                  */
                 private $mappedRelated1;

                     // ... more fields and methods
             }

             /** @Entity */
             class EntitySubClass extends MappedSuperclassBase
             {
                 /** @Id @Column(type="integer") */
                 private $id;
                 /** @Column(type="string") */
                 private $name;

                     // ... more fields and methods
             }




Doctrine 2       www.doctrine-project.org             www.sensiolabs.com
#sflive2010

                  Mapped Superclasses


    CREATE TABLE EntitySubClass (mapped1 INTEGER NOT NULL,
    mapped2 TEXT NOT NULL,
    id INTEGER NOT NULL,
    name TEXT NOT NULL,
    related1_id INTEGER DEFAULT NULL,
    PRIMARY KEY(id))




             http://www.doctrine-project.org/documentation/manual/2_0/en/inheritance-mapping#mapped-superclasses

Doctrine 2        www.doctrine-project.org                      www.sensiolabs.com
#sflive2010

              Single Table Inheritance
         /**
           * @Entity
           * @InheritanceType("SINGLE_TABLE")
           * @DiscriminatorColumn(name="discr", type="string")
           * @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
           */
         class Person
         {
              // ...
         }

         /**
           * @Entity
           */
         class Employee extends Person
         {
              // ...
         }




Doctrine 2        www.doctrine-project.org   www.sensiolabs.com
#sflive2010

             Single Table Inheritance
• All entities share one table.

• To distinguish which row represents which
  type in the hierarchy a so-called
  discriminator column is used.




             http://www.doctrine-project.org/documentation/manual/2_0/en/inheritance-mapping#single-table-inheritance


Doctrine 2         www.doctrine-project.org                        www.sensiolabs.com
#sflive2010

             Class Table Inheritance
 namespace MyProjectModel;

 /**
   * @Entity
   * @InheritanceType("JOINED")
   * @DiscriminatorColumn(name="discr", type="string")
   * @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
   */
 class Person
 {
      // ...
 }

 /** @Entity */
 class Employee extends Person
 {
     // ...
 }
             http://www.doctrine-project.org/documentation/manual/2_0/en/inheritance-mapping#single-table-inheritance

Doctrine 2       www.doctrine-project.org                        www.sensiolabs.com
#sflive2010

             Class Table Inheritance
• Each class in a hierarchy is mapped to
  several tables: its own table and the tables
  of all parent classes.
• The table of a child class is linked to the
  table of a parent class through a foreign
  key constraint.
• A discriminator column is used in the
  topmost table of the hierarchy because this
  is the easiest way to achieve polymorphic
  queries.

Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                       Batch Processing
• Doctrine 2 offers the ability to do some
  batch processing by taking advantage of
  the transactional write-behind behavior of
  an EntityManager




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                      Bulk Inserts
• Insert 10000 objects with a batch size of 20


             $batchSize = 20;
             for ($i = 1; $i <= 10000; ++$i) {
                 $user = new CmsUser;
                 $user->setStatus('user');
                 $user->setUsername('user' . $i);
                 $user->setName('Mr.Smith-' . $i);
                 $em->persist($user);
                 if ($i % $batchSize == 0) {
                     $em->flush();
                     $em->clear(); // Detaches all objects from Doctrine!
                 }
             }




Doctrine 2       www.doctrine-project.org    www.sensiolabs.com
#sflive2010

                                     Bulk Update
• Bulk update with DQL



       $q = $em->createQuery('update MyProjectModelManager m set
       m.salary = m.salary * 0.9');
       $numUpdated = $q->execute();




Doctrine 2      www.doctrine-project.org   www.sensiolabs.com
#sflive2010

                                    Bulk Update
• Bulk update by iterating over the results
  using the Query::iterate() method to avoid
  loading everything into memory at once
             $batchSize = 20;
             $i = 0;
             $q = $em->createQuery('select u from MyProjectModelUser u');
             $iterableResult = $q->iterate();
             foreach($iterableResult AS $row) {
                 $user = $row[0];
                 $user->increaseCredit();
                 $user->calculateNewBonuses();
                 if (($i % $batchSize) == 0) {
                     $em->flush(); // Executes all updates.
                     $em->clear(); // Detaches all objects from Doctrine!
                 }
                 ++$i;
             }



Doctrine 2     www.doctrine-project.org        www.sensiolabs.com
#sflive2010

                                     Bulk Delete
• Bulk delete with DQL




       $q = $em->createQuery('delete from MyProjectModelManager m
       where m.salary > 100000');
       $numDeleted = $q->execute();




Doctrine 2     www.doctrine-project.org    www.sensiolabs.com
#sflive2010

                                        Bulk Delete
• Just like the bulk updates you can iterate
  over a query to avoid loading everything
  into memory all at once.

             $batchSize = 20;
             $i = 0;
             $q = $em->createQuery('select u from MyProjectModelUser u');
             $iterableResult = $q->iterate();
             while (($row = $iterableResult->next()) !== false) {
                 $em->remove($row[0]);
                 if (($i % $batchSize) == 0) {
                     $em->flush(); // Executes all deletions.
                     $em->clear(); // Detaches all objects from Doctrine!
                 }
                 ++$i;
             }



Doctrine 2        www.doctrine-project.org    www.sensiolabs.com
#sflive2010

NativeQuery + ResultSetMapping
• The NativeQuery class is used to execute
  raw SQL queries

• The ResultSetMapping class is used to
  define how to hydrate the results of that
  query




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

NativeQuery + ResultSetMapping
• Here is a simple example
      $rsm = new ResultSetMapping;
      $rsm->addEntityResult('DoctrineTestsModelsCMSCmsUser', 'u');
      $rsm->addFieldResult('u', 'id', 'id');
      $rsm->addFieldResult('u', 'name', 'name');

      $query = $this->_em->createNativeQuery(
          'SELECT id, name FROM cms_users WHERE username = ?',
          $rsm
      );
      $query->setParameter(1, 'romanb');

      $users = $query->getResult();




Doctrine 2     www.doctrine-project.org   www.sensiolabs.com
#sflive2010

NativeQuery + ResultSetMapping
• The result of $users would look like


             array(
                 [0] => User (Object)
             )




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010

NativeQuery + ResultSetMapping
• This means you will always be able to
  fallback to the power of raw SQL without
  losing the ability to hydrate the data to your
  entities




Doctrine 2   www.doctrine-project.org   www.sensiolabs.com
#sflive2010



              Questions?
     Jonathan H. Wage
     jonathan.wage@sensio.com
     +1 415 992 5468

     sensiolabs.com | doctrine-project.org | sympalphp.org | jwage.com


      You can contact Jonathan about Doctrine and Open-Source or for
      training, consulting, application development, or business related
                   questions at jonathan.wage@sensio.com


Doctrine 2     www.doctrine-project.org   www.sensiolabs.com
Ad

More Related Content

What's hot (20)

How VXLAN works on Linux by Etsuji Nakai, has 22 slides with 27036 views.This document discusses how VXLAN works on Linux in 3 parts: (1) it explains the basic mechanism of VXLAN including packet encapsulation and ARP resolution, (2) it describes how OpenStack Neutron implements VXLAN using the OVS plugin and ML2 l2population driver, and (3) it discusses the Flannel implementation of VTEP using Linux kernel extensions and an etcd key-value store.
How VXLAN works on LinuxHow VXLAN works on Linux
How VXLAN works on Linux
Etsuji Nakai
22 slides27K views
CKA Certified Kubernetes Administrator Notes by Adnan Rashid, has 58 slides with 2774 views.Unique course notes for the Certified Kubernetes Administrator (CKA) for each section of the exam. Designed to be engaging and used as a reference in the future for kubernetes concepts.
CKA Certified Kubernetes Administrator Notes CKA Certified Kubernetes Administrator Notes
CKA Certified Kubernetes Administrator Notes
Adnan Rashid
58 slides2.8K views
Introduction to Apache Hive by Avkash Chauhan, has 35 slides with 13300 views.Hive is a data warehouse infrastructure built on top of Hadoop for providing data summarization, query, and analysis. It presents a SQL-like interface for querying data stored in various databases and file systems that integrate with Hadoop. The document provides links to Hive documentation, tutorials, presentations and other resources for learning about and using Hive. It also includes a table describing common Hive CLI commands and their usage.
Introduction to Apache HiveIntroduction to Apache Hive
Introduction to Apache Hive
Avkash Chauhan
35 slides13.3K views
Getting Started with Kubernetes by VMware Tanzu, has 31 slides with 6908 views.If you’re working with just a few containers, managing them isn't too complicated. But what if you have hundreds or thousands? Think about having to handle multiple upgrades for each container, keeping track of container and node state, available resources, and more. That’s where Kubernetes comes in. Kubernetes is an open source container management platform that helps you run containers at scale. This talk will cover Kubernetes components and show how to run applications on it.
Getting Started with Kubernetes Getting Started with Kubernetes
Getting Started with Kubernetes
VMware Tanzu
31 slides6.9K views
Cluster-as-code. The Many Ways towards Kubernetes by QAware GmbH, has 20 slides with 109 views.iSAQB Software Architecture Gathering – Digital 2022, November 2022, Mario-Leander Reimer (@LeanderReimer, Principal Software Architect bei QAware). == Dokument bitte herunterladen, falls unscharf! Please download slides if blurred! == Kubernetes is the de-facto standard when it comes to container orchestration. But why is there is no established, standard and uniform way to spin-up and manage a single or even a whole farm of Kubernetes clusters yet? Instead, a whole bunch of different and mostly incompatible ways towards Kubernetes exist today. Each with its own pros and cons in regards to ease of use, flexibility and many other requirements. In this session we will have a closer look at the different available options to create, manage and operate Kubernetes clusters at scale.
Cluster-as-code. The Many Ways towards KubernetesCluster-as-code. The Many Ways towards Kubernetes
Cluster-as-code. The Many Ways towards Kubernetes
QAware GmbH
20 slides109 views
Introduction to docker by Frederik Mogensen, has 39 slides with 15905 views.This document provides an introduction to Docker. It begins by introducing the presenter and agenda. It then explains that containers are not virtual machines and discusses the differences in architecture and benefits. It covers the basic Docker workflow of building, shipping, and running containers. It discusses Docker concepts like images, containers, and registries. It demonstrates basic Docker commands. It shows how to define a Dockerfile and build an image. It discusses data persistence using volumes. It covers using Docker Compose to define and run multi-container applications and Docker Swarm for clustering. It provides recommendations for getting started with Docker at different levels.
Introduction to dockerIntroduction to docker
Introduction to docker
Frederik Mogensen
39 slides15.9K views
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams by ENSET, Université Hassan II Casablanca, has 129 slides with 40627 views.Ce support explique les concepts de base de Big Data Processing. Elle aborde les parties suivantes : Série de vidéos : https://www.youtube.com/watch?v=1JAljjxpm-Q - Introduction au Big Data - Système de stockage en Big Data - Batch Processing et Stream Processing en Big Data - Aperçu bref de l’écosystème de Hadoop - Aperçu de l’écosystème des outils du Bid Gata - Big data stream processing avec Kafka écosystème - Architecture de Kafka (Brokers, Zookeeper, Procuder, Consumer, Kafka Streams, Connecteurs) - Comment démarrer un cluster de brokers KAFKA - Création et configuration des Topics - Création d’un Java Kafka consumer - Création d’un Java Kafka Produder - Kafka Producer et Kafka Consumer dans une application basée sur Spring - Kafka Streams - Intégration de Kafka dans Spring Cloud. Mot clés : Big data, Big Data Processing, Stream Processing, Kafka, Kafka Streams, Java, Spring Bon apprentissage
Traitement distribue en BIg Data - KAFKA Broker and Kafka StreamsTraitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
ENSET, Université Hassan II Casablanca
129 slides40.6K views
Alphorm.com Formation CCNP ENCOR 350-401 (3of8) : Sans Fil by Alphorm, has 169 slides with 2492 views.La formation CCNP ENCOR 3/8 est pour objectif de la préparation à la certification 350-401 ENCOR. Ce cours permet d’apprendre, d’appliquer et de mettre en pratique les connaissances et les compétences de CCNP Enterprise grâce aux concepts théoriques à une série d'expériences pratiques approfondies qui renforce l’apprentissage. Avec cette formation et la formation CCNP ENCOR, vous possédera les outils pour envisager une inscription à l’examen de certification 350-401.
Alphorm.com Formation CCNP ENCOR 350-401 (3of8) : Sans FilAlphorm.com Formation CCNP ENCOR 350-401 (3of8) : Sans Fil
Alphorm.com Formation CCNP ENCOR 350-401 (3of8) : Sans Fil
Alphorm
169 slides2.5K views
Docker introduction by dotCloud, has 29 slides with 457278 views.Docker is a system for running applications in isolated containers. It addresses issues with traditional virtual machines by providing lightweight containers that share resources and allow applications to run consistently across different environments. Docker eliminates inconsistencies in development, testing and production environments. It allows applications and their dependencies to be packaged into a standardized unit called a container that can run on any Linux server. This makes applications highly portable and improves efficiency across the entire development lifecycle.
Docker introductionDocker introduction
Docker introduction
dotCloud
29 slides457.3K views
Using Netconf/Yang with OpenDalight by Глеб Хохлов, has 30 slides with 1149 views.OpenDaylight is an open source platform for programmable networks that supports NETCONF/Yang. It provides tools for working with Yang models including code generation from Yang definitions. Various open source projects provide Yang modeling and NETCONF/RESTCONF capabilities using OpenDaylight.
Using Netconf/Yang with OpenDalightUsing Netconf/Yang with OpenDalight
Using Netconf/Yang with OpenDalight
Глеб Хохлов
30 slides1.1K views
Introduction to Docker by Pubudu Jayawardana, has 20 slides with 868 views.Docker is a tool that allows applications to run in isolated containers to make them portable and consistent across environments. It provides benefits like easy developer onboarding, eliminating application conflicts, and consistent deployments. Docker tools include the Docker Engine, Docker Client, Docker Compose, and Docker Hub. Key concepts are images which are templates for containers, and containers which are where the code runs based on an image. The document outlines how to build custom images from Dockerfiles, communicate between containers using linking or networks, and deploy containers using Docker Compose or in the cloud.
Introduction to DockerIntroduction to Docker
Introduction to Docker
Pubudu Jayawardana
20 slides868 views
Using arrays with PHP for forms and storing information by Nicole Ryan, has 42 slides with 3630 views.This document discusses using arrays with PHP for forms and storing information. It covers manipulating array elements, exploring associative arrays, finding and extracting elements and values, and using multidimensional arrays. Specific techniques covered include adding and removing elements from arrays, removing duplicate elements, iterating through arrays, returning portions of arrays, and using arrays to store form data submitted from web forms.
Using arrays with PHP for forms and storing informationUsing arrays with PHP for forms and storing information
Using arrays with PHP for forms and storing information
Nicole Ryan
42 slides3.6K views
Architectures for open and scalable clouds by Randy Bias, has 34 slides with 60571 views.My presentation for 2012's Cloud Connect that goes over architectural and design patterns for open and scalable clouds. Technical deck targeted at business audiences with a technical bent.
Architectures for open and scalable cloudsArchitectures for open and scalable clouds
Architectures for open and scalable clouds
Randy Bias
34 slides60.6K views
From Zero to Docker by Abhishek Verma, has 25 slides with 269 views.The document discusses Docker and containerization. It introduces Docker Enterprise Edition which provides end-to-end features for container apps along with enterprise grade security and support. It also discusses Docker Assemble, a tool that can build an optimized Docker container from source code without needing a Dockerfile by detecting frameworks, adding dependencies, and optimizing the image. The document demonstrates using Docker Assemble and deploying containers to Docker Universal Control Plane (UCP) for cluster management.
From Zero to DockerFrom Zero to Docker
From Zero to Docker
Abhishek Verma
25 slides269 views
Docker introduction &amp; benefits by Amit Manwade, has 12 slides with 1145 views.Docker allows for easy deployment and management of applications by wrapping them in containers. It provides benefits like running multiple isolated environments on a single server, easily moving applications between environments, and ensuring consistency across environments. The document discusses using Docker for development, production, and monitoring containers, and outlines specific benefits like reducing deployment time from days to minutes, optimizing hardware usage, reducing transfer sizes, and enhancing productivity. Future plans mentioned include using Kubernetes for container orchestration.
Docker introduction &amp; benefitsDocker introduction &amp; benefits
Docker introduction &amp; benefits
Amit Manwade
12 slides1.1K views
Midi technique - présentation docker by Olivier Eeckhoutte, has 43 slides with 2711 views.J'ai retrouvé cette ancienne présentation que j'avais fait qui date de janvier 2016.
Midi technique - présentation dockerMidi technique - présentation docker
Midi technique - présentation docker
Olivier Eeckhoutte
43 slides2.7K views
Exploring Docker in CI/CD by Henry Huang, has 29 slides with 2302 views.This document discusses using Docker for continuous integration and continuous delivery (CI/CD) processes. It covers using Docker for coding, building, and running Jenkins with Docker. Docker provides benefits like easy to prepare development environments, faster builds with no library dependencies, increased robustness, and compatibility with existing CI tools. The document provides examples of building Docker from within a Docker container, running Jenkins to build Docker images, and running Jenkins in Docker containers with plugins for building and executing tasks inside Docker.
Exploring Docker in CI/CDExploring Docker in CI/CD
Exploring Docker in CI/CD
Henry Huang
29 slides2.3K views
Dockerを支える技術 by Etsuji Nakai, has 43 slides with 82734 views.Linux女子部08「Docker勉強会」 http://connpass.com/event/6318/ で使用予定の資料の一部です。 変更履歴 ver1.0 公開 ver1.1 参考資料追加、微修正 ver1.2 pid namespaceの例を変更、微修正 ver1.3 Fedora20 + Docker1.0 に手順を変更 ver1.4 dm-thinprovisiongのイメージを直接操作する手順を復活 ver1.5 LVMによるdm-thinprovisioningの図を追加 ver1.6 微修正 ver1.7 LVMでのdm-thin snapshotは変更できない旨を記載 、スナップショット作成の図を微修正 ver1.8 「LVMでのdm-thin snapshotは変更できない旨」は間違ってたので、snapshotを有効化する方法を追記
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
Etsuji Nakai
43 slides82.7K views
Graylog by Knoldus Inc., has 13 slides with 594 views.Graylog is a leading centralized log management solution for capturing, storing, and enabling real-time analysis of terabytes of machine data.
GraylogGraylog
Graylog
Knoldus Inc.
13 slides594 views
Docker Basics by DuckDuckGo, has 33 slides with 1925 views.Docker is an open source containerization platform that allows applications to be easily deployed and run across various operating systems and cloud environments. It allows applications and their dependencies to be packaged into standardized executable units called containers that can be run anywhere. Containers are more portable and provide better isolation than virtual machines, making them useful for microservices architecture, continuous integration/deployment, and cloud-native applications.
Docker BasicsDocker Basics
Docker Basics
DuckDuckGo
33 slides1.9K views
Alphorm.com Formation CCNP ENCOR 350-401 (3of8) : Sans Fil
Alphorm.com Formation CCNP ENCOR 350-401 (3of8) : Sans FilAlphorm.com Formation CCNP ENCOR 350-401 (3of8) : Sans Fil
Alphorm.com Formation CCNP ENCOR 350-401 (3of8) : Sans Fil
Alphorm
 
Docker introduction
Docker introductionDocker introduction
Docker introduction
dotCloud
 
Using arrays with PHP for forms and storing information
Using arrays with PHP for forms and storing informationUsing arrays with PHP for forms and storing information
Using arrays with PHP for forms and storing information
Nicole Ryan
 
Architectures for open and scalable clouds
Architectures for open and scalable cloudsArchitectures for open and scalable clouds
Architectures for open and scalable clouds
Randy Bias
 
Docker introduction &amp; benefits
Docker introduction &amp; benefitsDocker introduction &amp; benefits
Docker introduction &amp; benefits
Amit Manwade
 
Midi technique - présentation docker
Midi technique - présentation dockerMidi technique - présentation docker
Midi technique - présentation docker
Olivier Eeckhoutte
 
Exploring Docker in CI/CD
Exploring Docker in CI/CDExploring Docker in CI/CD
Exploring Docker in CI/CD
Henry Huang
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
Etsuji Nakai
 

Viewers also liked (20)

What Is Doctrine?
What Is Doctrine?What Is Doctrine?
What Is Doctrine?
Jonathan Wage
 
Effective Doctrine2: Performance Tips for Symfony2 Developers
Effective Doctrine2: Performance Tips for Symfony2 DevelopersEffective Doctrine2: Performance Tips for Symfony2 Developers
Effective Doctrine2: Performance Tips for Symfony2 Developers
Marcin Chwedziak
 
Object Relational Mapping in PHP
Object Relational Mapping in PHPObject Relational Mapping in PHP
Object Relational Mapping in PHP
Rob Knight
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricks
Javier Eguiluz
 
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
Javier Eguiluz
 
hbase lab
hbase labhbase lab
hbase lab
marwa baich
 
DDD with Behat
DDD with BehatDDD with Behat
DDD with Behat
Anton Serdyuk
 
TRADE AND ECONOMIC DEVELOPMENT
TRADE AND ECONOMIC DEVELOPMENTTRADE AND ECONOMIC DEVELOPMENT
TRADE AND ECONOMIC DEVELOPMENT
Cláudio Carneiro
 
Understanding Doctrine at True North PHP 2013
Understanding Doctrine at True North PHP 2013Understanding Doctrine at True North PHP 2013
Understanding Doctrine at True North PHP 2013
Juti Noppornpitak
 
Symfony 2.0 on PHP 5.3
Symfony 2.0 on PHP 5.3Symfony 2.0 on PHP 5.3
Symfony 2.0 on PHP 5.3
Fabien Potencier
 
Les règles de passage
Les règles de passageLes règles de passage
Les règles de passage
marwa baich
 
Symfony2. Database and Doctrine
Symfony2. Database and DoctrineSymfony2. Database and Doctrine
Symfony2. Database and Doctrine
Vladimir Doroshenko
 
Hướng dẫn lập trình web với PHP - Ngày 2
Hướng dẫn lập trình web với PHP - Ngày 2Hướng dẫn lập trình web với PHP - Ngày 2
Hướng dẫn lập trình web với PHP - Ngày 2
Nguyễn Tuấn Quỳnh
 
Symfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 IntegrationSymfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 Integration
Jonathan Wage
 
Ssm Theology Week 8
Ssm Theology Week 8Ssm Theology Week 8
Ssm Theology Week 8
Alan Shelby
 
Ecclesiology Part 4 - Discipleship 2 -The Cost of discipleship
Ecclesiology Part 4  -  Discipleship 2 -The Cost of discipleshipEcclesiology Part 4  -  Discipleship 2 -The Cost of discipleship
Ecclesiology Part 4 - Discipleship 2 -The Cost of discipleship
Robert Tan
 
Ssm Theology Week 2
Ssm Theology Week 2Ssm Theology Week 2
Ssm Theology Week 2
Alan Shelby
 
Ecclessiology 2
Ecclessiology 2Ecclessiology 2
Ecclessiology 2
Bangkok, Thailand
 
Is The Trinity Doctrine Divinely Inspired
Is The Trinity Doctrine Divinely InspiredIs The Trinity Doctrine Divinely Inspired
Is The Trinity Doctrine Divinely Inspired
zakir2012
 
Ecclesiology Part 2 - The Purpose of the Church.
Ecclesiology Part 2 - The Purpose of the Church.Ecclesiology Part 2 - The Purpose of the Church.
Ecclesiology Part 2 - The Purpose of the Church.
Robert Tan
 
Effective Doctrine2: Performance Tips for Symfony2 Developers
Effective Doctrine2: Performance Tips for Symfony2 DevelopersEffective Doctrine2: Performance Tips for Symfony2 Developers
Effective Doctrine2: Performance Tips for Symfony2 Developers
Marcin Chwedziak
 
Object Relational Mapping in PHP
Object Relational Mapping in PHPObject Relational Mapping in PHP
Object Relational Mapping in PHP
Rob Knight
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricks
Javier Eguiluz
 
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)New Symfony Tips & Tricks (SymfonyCon Paris 2015)
New Symfony Tips & Tricks (SymfonyCon Paris 2015)
Javier Eguiluz
 
TRADE AND ECONOMIC DEVELOPMENT
TRADE AND ECONOMIC DEVELOPMENTTRADE AND ECONOMIC DEVELOPMENT
TRADE AND ECONOMIC DEVELOPMENT
Cláudio Carneiro
 
Understanding Doctrine at True North PHP 2013
Understanding Doctrine at True North PHP 2013Understanding Doctrine at True North PHP 2013
Understanding Doctrine at True North PHP 2013
Juti Noppornpitak
 
Les règles de passage
Les règles de passageLes règles de passage
Les règles de passage
marwa baich
 
Hướng dẫn lập trình web với PHP - Ngày 2
Hướng dẫn lập trình web với PHP - Ngày 2Hướng dẫn lập trình web với PHP - Ngày 2
Hướng dẫn lập trình web với PHP - Ngày 2
Nguyễn Tuấn Quỳnh
 
Symfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 IntegrationSymfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 Integration
Jonathan Wage
 
Ssm Theology Week 8
Ssm Theology Week 8Ssm Theology Week 8
Ssm Theology Week 8
Alan Shelby
 
Ecclesiology Part 4 - Discipleship 2 -The Cost of discipleship
Ecclesiology Part 4  -  Discipleship 2 -The Cost of discipleshipEcclesiology Part 4  -  Discipleship 2 -The Cost of discipleship
Ecclesiology Part 4 - Discipleship 2 -The Cost of discipleship
Robert Tan
 
Ssm Theology Week 2
Ssm Theology Week 2Ssm Theology Week 2
Ssm Theology Week 2
Alan Shelby
 
Is The Trinity Doctrine Divinely Inspired
Is The Trinity Doctrine Divinely InspiredIs The Trinity Doctrine Divinely Inspired
Is The Trinity Doctrine Divinely Inspired
zakir2012
 
Ecclesiology Part 2 - The Purpose of the Church.
Ecclesiology Part 2 - The Purpose of the Church.Ecclesiology Part 2 - The Purpose of the Church.
Ecclesiology Part 2 - The Purpose of the Church.
Robert Tan
 
Ad

Similar to Doctrine 2 - Not The Same Old Php Orm (20)

Doctrine2
Doctrine2Doctrine2
Doctrine2
escorpion2610
 
Doctrine 2 - Enterprise Persistence Layer For PHP
Doctrine 2 - Enterprise Persistence Layer For PHPDoctrine 2 - Enterprise Persistence Layer For PHP
Doctrine 2 - Enterprise Persistence Layer For PHP
Jonathan Wage
 
Doctrine2 enterpice
Doctrine2 enterpiceDoctrine2 enterpice
Doctrine2 enterpice
escorpion2610
 
Introduction To Doctrine 2
Introduction To Doctrine 2Introduction To Doctrine 2
Introduction To Doctrine 2
Jonathan Wage
 
Intro to Python for C# Developers
Intro to Python for C# DevelopersIntro to Python for C# Developers
Intro to Python for C# Developers
Sarah Dutkiewicz
 
What's New In Doctrine
What's New In DoctrineWhat's New In Doctrine
What's New In Doctrine
Jonathan Wage
 
Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1
Andrei KUCHARAVY
 
Doctrine 2: Enterprise Persistence Layer for PHP
Doctrine 2: Enterprise Persistence Layer for PHPDoctrine 2: Enterprise Persistence Layer for PHP
Doctrine 2: Enterprise Persistence Layer for PHP
Jonathan Wage
 
Tyrion Cannister Neural Styles by Dora Korpar and Siphan Bou
Tyrion Cannister Neural Styles by Dora Korpar and Siphan BouTyrion Cannister Neural Styles by Dora Korpar and Siphan Bou
Tyrion Cannister Neural Styles by Dora Korpar and Siphan Bou
Docker, Inc.
 
Overcoming common knowledge: 100k nodes in a single folder
Overcoming common knowledge: 100k nodes in a single folderOvercoming common knowledge: 100k nodes in a single folder
Overcoming common knowledge: 100k nodes in a single folder
ITD Systems
 
Introduction to Python
Introduction to PythonIntroduction to Python
Introduction to Python
Return on Intelligence
 
How to not suck at JavaScript
How to not suck at JavaScriptHow to not suck at JavaScript
How to not suck at JavaScript
tmont
 
Refactor your code: when, why and how?
Refactor your code: when, why and how?Refactor your code: when, why and how?
Refactor your code: when, why and how?
Nacho Cougil
 
Introduction to python
Introduction to pythonIntroduction to python
Introduction to python
Return on Intelligence
 
Js tips & tricks
Js tips & tricksJs tips & tricks
Js tips & tricks
Asia Tyshchenko
 
« Training Within Software » using Dojo and Mob Programming by Bernard Notari...
« Training Within Software » using Dojo and Mob Programming by Bernard Notari...« Training Within Software » using Dojo and Mob Programming by Bernard Notari...
« Training Within Software » using Dojo and Mob Programming by Bernard Notari...
Institut Lean France
 
Libertyvasion2010
Libertyvasion2010Libertyvasion2010
Libertyvasion2010
Jonathan Wage
 
When Drupal meets OpenData
When Drupal meets OpenDataWhen Drupal meets OpenData
When Drupal meets OpenData
Twinbit
 
Ruby codebases in an entropic universe
Ruby codebases in an entropic universeRuby codebases in an entropic universe
Ruby codebases in an entropic universe
Niranjan Paranjape
 
Java Fundamentalojhgghjjjjhhgghhjjjjhhj.ppt
Java Fundamentalojhgghjjjjhhgghhjjjjhhj.pptJava Fundamentalojhgghjjjjhhgghhjjjjhhj.ppt
Java Fundamentalojhgghjjjjhhgghhjjjjhhj.ppt
akashsachu221
 
Doctrine 2 - Enterprise Persistence Layer For PHP
Doctrine 2 - Enterprise Persistence Layer For PHPDoctrine 2 - Enterprise Persistence Layer For PHP
Doctrine 2 - Enterprise Persistence Layer For PHP
Jonathan Wage
 
Introduction To Doctrine 2
Introduction To Doctrine 2Introduction To Doctrine 2
Introduction To Doctrine 2
Jonathan Wage
 
Intro to Python for C# Developers
Intro to Python for C# DevelopersIntro to Python for C# Developers
Intro to Python for C# Developers
Sarah Dutkiewicz
 
What's New In Doctrine
What's New In DoctrineWhat's New In Doctrine
What's New In Doctrine
Jonathan Wage
 
Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1
Andrei KUCHARAVY
 
Doctrine 2: Enterprise Persistence Layer for PHP
Doctrine 2: Enterprise Persistence Layer for PHPDoctrine 2: Enterprise Persistence Layer for PHP
Doctrine 2: Enterprise Persistence Layer for PHP
Jonathan Wage
 
Tyrion Cannister Neural Styles by Dora Korpar and Siphan Bou
Tyrion Cannister Neural Styles by Dora Korpar and Siphan BouTyrion Cannister Neural Styles by Dora Korpar and Siphan Bou
Tyrion Cannister Neural Styles by Dora Korpar and Siphan Bou
Docker, Inc.
 
Overcoming common knowledge: 100k nodes in a single folder
Overcoming common knowledge: 100k nodes in a single folderOvercoming common knowledge: 100k nodes in a single folder
Overcoming common knowledge: 100k nodes in a single folder
ITD Systems
 
How to not suck at JavaScript
How to not suck at JavaScriptHow to not suck at JavaScript
How to not suck at JavaScript
tmont
 
Refactor your code: when, why and how?
Refactor your code: when, why and how?Refactor your code: when, why and how?
Refactor your code: when, why and how?
Nacho Cougil
 
« Training Within Software » using Dojo and Mob Programming by Bernard Notari...
« Training Within Software » using Dojo and Mob Programming by Bernard Notari...« Training Within Software » using Dojo and Mob Programming by Bernard Notari...
« Training Within Software » using Dojo and Mob Programming by Bernard Notari...
Institut Lean France
 
When Drupal meets OpenData
When Drupal meets OpenDataWhen Drupal meets OpenData
When Drupal meets OpenData
Twinbit
 
Ruby codebases in an entropic universe
Ruby codebases in an entropic universeRuby codebases in an entropic universe
Ruby codebases in an entropic universe
Niranjan Paranjape
 
Java Fundamentalojhgghjjjjhhgghhjjjjhhj.ppt
Java Fundamentalojhgghjjjjhhgghhjjjjhhj.pptJava Fundamentalojhgghjjjjhhgghhjjjjhhj.ppt
Java Fundamentalojhgghjjjjhhgghhjjjjhhj.ppt
akashsachu221
 
Ad

More from Jonathan Wage (16)

Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
Jonathan Wage
 
OpenSky Infrastructure
OpenSky InfrastructureOpenSky Infrastructure
OpenSky Infrastructure
Jonathan Wage
 
Doctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 ParisDoctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 Paris
Jonathan Wage
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the Trenches
Jonathan Wage
 
Doctrine in the Real World
Doctrine in the Real WorldDoctrine in the Real World
Doctrine in the Real World
Jonathan Wage
 
ZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODMZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODM
Jonathan Wage
 
ZendCon2010 The Doctrine Project
ZendCon2010 The Doctrine ProjectZendCon2010 The Doctrine Project
ZendCon2010 The Doctrine Project
Jonathan Wage
 
Symfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODMSymfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODM
Jonathan Wage
 
Doctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document MapperDoctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document Mapper
Jonathan Wage
 
Sympal A Cmf Based On Symfony
Sympal   A Cmf Based On SymfonySympal   A Cmf Based On Symfony
Sympal A Cmf Based On Symfony
Jonathan Wage
 
Symfony 1.3 + Doctrine 1.2
Symfony 1.3 + Doctrine 1.2Symfony 1.3 + Doctrine 1.2
Symfony 1.3 + Doctrine 1.2
Jonathan Wage
 
Sympal - The flexible Symfony CMS
Sympal - The flexible Symfony CMSSympal - The flexible Symfony CMS
Sympal - The flexible Symfony CMS
Jonathan Wage
 
What's new in Doctrine
What's new in DoctrineWhat's new in Doctrine
What's new in Doctrine
Jonathan Wage
 
Sympal - Symfony CMS Preview
Sympal - Symfony CMS PreviewSympal - Symfony CMS Preview
Sympal - Symfony CMS Preview
Jonathan Wage
 
Doctrine Php Object Relational Mapper
Doctrine Php Object Relational MapperDoctrine Php Object Relational Mapper
Doctrine Php Object Relational Mapper
Jonathan Wage
 
Sympal - The Flexible Symfony Cms
Sympal - The Flexible Symfony CmsSympal - The Flexible Symfony Cms
Sympal - The Flexible Symfony Cms
Jonathan Wage
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
Jonathan Wage
 
OpenSky Infrastructure
OpenSky InfrastructureOpenSky Infrastructure
OpenSky Infrastructure
Jonathan Wage
 
Doctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 ParisDoctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 Paris
Jonathan Wage
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the Trenches
Jonathan Wage
 
Doctrine in the Real World
Doctrine in the Real WorldDoctrine in the Real World
Doctrine in the Real World
Jonathan Wage
 
ZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODMZendCon2010 Doctrine MongoDB ODM
ZendCon2010 Doctrine MongoDB ODM
Jonathan Wage
 
ZendCon2010 The Doctrine Project
ZendCon2010 The Doctrine ProjectZendCon2010 The Doctrine Project
ZendCon2010 The Doctrine Project
Jonathan Wage
 
Symfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODMSymfony Day 2010 Doctrine MongoDB ODM
Symfony Day 2010 Doctrine MongoDB ODM
Jonathan Wage
 
Doctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document MapperDoctrine MongoDB Object Document Mapper
Doctrine MongoDB Object Document Mapper
Jonathan Wage
 
Sympal A Cmf Based On Symfony
Sympal   A Cmf Based On SymfonySympal   A Cmf Based On Symfony
Sympal A Cmf Based On Symfony
Jonathan Wage
 
Symfony 1.3 + Doctrine 1.2
Symfony 1.3 + Doctrine 1.2Symfony 1.3 + Doctrine 1.2
Symfony 1.3 + Doctrine 1.2
Jonathan Wage
 
Sympal - The flexible Symfony CMS
Sympal - The flexible Symfony CMSSympal - The flexible Symfony CMS
Sympal - The flexible Symfony CMS
Jonathan Wage
 
What's new in Doctrine
What's new in DoctrineWhat's new in Doctrine
What's new in Doctrine
Jonathan Wage
 
Sympal - Symfony CMS Preview
Sympal - Symfony CMS PreviewSympal - Symfony CMS Preview
Sympal - Symfony CMS Preview
Jonathan Wage
 
Doctrine Php Object Relational Mapper
Doctrine Php Object Relational MapperDoctrine Php Object Relational Mapper
Doctrine Php Object Relational Mapper
Jonathan Wage
 
Sympal - The Flexible Symfony Cms
Sympal - The Flexible Symfony CmsSympal - The Flexible Symfony Cms
Sympal - The Flexible Symfony Cms
Jonathan Wage
 

Recently uploaded (20)

Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
Semantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AISemantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AI
artmondano
 
Quantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur MorganQuantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur Morgan
Arthur Morgan
 
Generative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in BusinessGenerative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in Business
Dr. Tathagat Varma
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
Mastering Advance Window Functions in SQL.pdf
Mastering Advance Window Functions in SQL.pdfMastering Advance Window Functions in SQL.pdf
Mastering Advance Window Functions in SQL.pdf
Spiral Mantra
 
Social Media App Development Company-EmizenTech
Social Media App Development Company-EmizenTechSocial Media App Development Company-EmizenTech
Social Media App Development Company-EmizenTech
Steve Jonas
 
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
Into The Box Conference Keynote Day 1 (ITB2025)
Into The Box Conference Keynote Day 1 (ITB2025)Into The Box Conference Keynote Day 1 (ITB2025)
Into The Box Conference Keynote Day 1 (ITB2025)
Ortus Solutions, Corp
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
Electronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploitElectronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploit
niftliyevhuseyn
 
Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.
hpbmnnxrvb
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
Vaibhav Gupta BAML: AI work flows without Hallucinations
Vaibhav Gupta BAML: AI work flows without HallucinationsVaibhav Gupta BAML: AI work flows without Hallucinations
Vaibhav Gupta BAML: AI work flows without Hallucinations
john409870
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
Semantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AISemantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AI
artmondano
 
Quantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur MorganQuantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur Morgan
Arthur Morgan
 
Generative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in BusinessGenerative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in Business
Dr. Tathagat Varma
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
Mastering Advance Window Functions in SQL.pdf
Mastering Advance Window Functions in SQL.pdfMastering Advance Window Functions in SQL.pdf
Mastering Advance Window Functions in SQL.pdf
Spiral Mantra
 
Social Media App Development Company-EmizenTech
Social Media App Development Company-EmizenTechSocial Media App Development Company-EmizenTech
Social Media App Development Company-EmizenTech
Steve Jonas
 
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
Into The Box Conference Keynote Day 1 (ITB2025)
Into The Box Conference Keynote Day 1 (ITB2025)Into The Box Conference Keynote Day 1 (ITB2025)
Into The Box Conference Keynote Day 1 (ITB2025)
Ortus Solutions, Corp
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
Electronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploitElectronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploit
niftliyevhuseyn
 
Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.
hpbmnnxrvb
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
Vaibhav Gupta BAML: AI work flows without Hallucinations
Vaibhav Gupta BAML: AI work flows without HallucinationsVaibhav Gupta BAML: AI work flows without Hallucinations
Vaibhav Gupta BAML: AI work flows without Hallucinations
john409870
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 

Doctrine 2 - Not The Same Old Php Orm