SlideShare a Scribd company logo
A Database Factory for PHP
           http://phactory.org

                                                    Chris Kite
                               Sr. Web Engineer at Offers.com
© 2009 Vertive, Inc.
Proprietary and Confidential                        @chriskite
Phactory: What is it?

Alternative to database fixtures for unit
 tests
Define and create objects in code
Provides a lightweight ORM
Works with MySQL, SQLite, and
 MongoDB



     © 2009 Vertive, Inc.
     Proprietary and Confidential
Phactory is developed and used at
            Offers.com
Databases in Unit Testing


  © 2009 Vertive, Inc.
  Proprietary and Confidential
Database Fixtures

A fixture is a statically defined set of data
Each test can have its own dataset
PHPUnit provides support for loading
 fixtures:
  class DatabaseTest extends PHPUnit_Extensions_Database_TestCase
  {
     protected function getConnection()
     {
       $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
       return $this->createDefaultDBConnection($pdo, 'testdb');
     }

      protected function getDataSet()
      {
        return $this->createFlatXMLDataSet(dirname(__FILE__).'/_files/bank-account-seed.xml');
      }
  }

          © 2009 Vertive, Inc.
          Proprietary and Confidential
Database Fixtures
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
  <post
     post_id="1"
     title="My First Post"
     date_created="2008-12-01 12:30:29"
     contents="This is my first post" rating="5"
  />
 <post
     post_id="2"
     title="My Second Post"
     date_created="2008-12-04 15:35:25"
     contents="This is my second post"
  />
</dataset> Vertive, Inc.
        © 2009
       Proprietary and Confidential   Example from http://www.phpunit.de/manual/current/en/database.html
Database Fixtures

Drawbacks:
  » Typically in an unfriendly format like XML
  » You are left to your own devices to retrieve
    and manipulate data in your test
  » Can’t dynamically create objects
  » No concept of associations




     © 2009 Vertive, Inc.
     Proprietary and Confidential
Database Factories

Define database test data in code, not flat
 files
Create objects dynamically, rather than
 loading them all at once
Define associations between objects
Can integrate with or provide ORM
 functionality


     © 2009 Vertive, Inc.
     Proprietary and Confidential
Database Factories
Phactory Example
<?
Phactory::setConnection(new PDO('sqlite:test.db'));

Phactory::define('user', array('name' => 'Test User',
                                'email' => 'user@example.com'));

$user = Phactory::create('user'); // creates a row in the 'users' table

print("Hello, {$user->name}!"); // prints "Hello, Test User!"




        © 2009 Vertive, Inc.
        Proprietary and Confidential
Using Phactory


  © 2009 Vertive, Inc.
  Proprietary and Confidential
Connecting to the Database

Phactory supports MySQL, SQLite, and
 MongoDB
Uses PDO for SQL databases
<?
require_once 'Phactory/lib/Phactory.php';

$pdo = new PDO('mysql:host=127.0.0.1; dbname=testdb', 'user', 'password');

Phactory::setConnection($pdo);




         © 2009 Vertive, Inc.
         Proprietary and Confidential
Defining Table Blueprints

A blueprint defines default values for
 objects created in a particular table
<?
Phactory::define('user', array('name' => 'test_user',
                        'age' => 20));

Phactory::define('post', array('text' => 'This is a post',
                       'created_at' => 1296663323));




         © 2009 Vertive, Inc.
         Proprietary and Confidential
Creating Objects

When creating an object with Phactory,
 you can:
  » Specify values for fields that weren’t in the
    blueprint definition
  » Override any of the default values
  » Associate with other objects




     © 2009 Vertive, Inc.
     Proprietary and Confidential
Creating Objects
Phactory::define('user', array('name' => 'test_user', 'age' => 20));

$john = Phactory::create('user', array('name' => 'John Doe'));
$joe = Phactory::create('user', array('name' => 'Joe Smith', 'activated' => 1));
$anon = Phactory::create('user');

// $john looks like this:
$john->id == 1;
$john->name == 'John Doe';
$john->activated == 0;

// $joe looks like this:
$joe->id == 2;
$joe->name == 'Joe Smith';
$joe->activated == 1;

// $anon looks like this:
$anon->id == 3;
$anon->name == 'test_user';
$anon->activated == 0;
           © 2009 Vertive, Inc.
           Proprietary and Confidential
Retrieving Objects

Basic ORM functionality allows you to
 retrieve Phactory objects from the
 database
Uses a simple get() method which takes
 an array of columns to match
$joe = Phactory::get('user', array('id' => 2));

$joe = Phactory::get('user', array('age' => 20, 'activated' => 1));



        © 2009 Vertive, Inc.
        Proprietary and Confidential
Associations

For SQL databases, Phactory provides
 many-to-one and many-to-many
 associations
Foreign key columns and join tables are
 filled in automatically when creating an
 object with associations



     © 2009 Vertive, Inc.
     Proprietary and Confidential
Associations
Phactory::define('author');

Phactory::define('book',
           array('name' => 'Test Book'),
           array('primary_author' => Phactory::manyToOne('author')));

$twain = Phactory::create('author', array('name' => 'Mark Twain'));

$book = Phactory::createWithAssociations('book', array('primary_author'
=> $twain));

$book->author_id == $twain->getId();




          © 2009 Vertive, Inc.
          Proprietary and Confidential
Sequences

Define blueprints with automatically
 incrementing values
   » Include ‘$n’ in the definition
   » Sequence starts at 0, and is incremented
     each time an object is created
Phactory::define('user', array('name' => 'user$n', 'age' => '$n'));

$user0 = Phactory::create('user'); // name == 'user0', age == '0'
$user1 = Phactory::create('user'); // name == 'user1', age == '1'
$user2 = Phactory::create('user'); // name == 'user2', age == '2'


        © 2009 Vertive, Inc.
        Proprietary and Confidential
Phactory and PHPUnit


  © 2009 Vertive, Inc.
  Proprietary and Confidential
Basic Test Setup
require_once 'Phactory/lib/Phactory.php';
class ExampleTest extends PHPUnit_Framework_TestCase
{
   public static function setUpBeforeClass()
   {
     // create a db connection and tell Phactory to use it
     $pdo = new PDO("sqlite:test.db");
     Phactory::setConnection($pdo);

      // reset any existing blueprints and empty any tables Phactory has used
      Phactory::reset();

      // define default values for each user we will create
      Phactory::define('user', array('name' => 'Test User $n', 'age' => 18));
  }

  public static function tearDownAfterClass()
  {
    Phactory::reset();
  }

  public function tearDown()
  {
       // delete all objects from defined tables, but do not erase blueprints
       Phactory::recall();
  }
               © 2009 Vertive, Inc.
               Proprietary and Confidential
Structuring Shared Definitions

Usually many of the test classes in your
 suite will need to use the same tables
Define blueprints in one place, share them
 among many tests
  » Can include() a file of definitions, put
    definitions in a static class, etc.




     © 2009 Vertive, Inc.
     Proprietary and Confidential
Structuring Shared Definitions
SharedDefinitions.php
<?
Phactory::define('tag', array('name' => 'Tag $n'));

Phactory::define('post',
           array('name' => 'Test Blog Post', 'content' => 'Test Content'),
           array('tag' => Phactory::manyToMany('tag', 'posts_tags')));



ExampleTest.php
class ExampleTest extends PHPUnit_Framework_TestCase
{
   public static function setUpBeforeClass()
   {
     $pdo = new PDO("sqlite:test.db");
     Phactory::setConnection($pdo);
     Phactory::reset();

        // include definitions common to several tests
        include('SharedDefinitions.php');
    }
}

                © 2009 Vertive, Inc.
                Proprietary and Confidential
Dynamic Objects

Recall that with fixtures, your test data is
 all loaded at the start of the test
With Phactory, you can create or change
 test data during a test




     © 2009 Vertive, Inc.
     Proprietary and Confidential
Dynamic Objects
class MyPostClass {
      public static function countTagsForPost($post_id) {
            $stmt = $pdo->prepare("SELECT COUNT(*) AS num_tags
                                     FROM `posts_tags` WHERE `post_id` = ?");
            $stmt->execute(array($post_id));
            $result = $stmt->fetch();
            return $result['num_tags'];
      }
}

Phactory::define('tag',
             array('name' => 'Tag $n'),
             array('post' => Phactory::manyToMany('post', 'posts_tags')));

Phactory::define('post',
           array('name' => 'Test Blog Post', 'content' => 'Test Content'),
           array('tag' => Phactory::manyToMany('tag', 'posts_tags')));

$post = Phactory::create('post');

$this->assertEquals(0, MyPostClass::countTagsForPost($post->getId()));
$tag = Phactory::createWithAssociations('tag', array('post' => $post));
          © 2009 Vertive, Inc.
$this->assertEquals(1, MyPostClass::countTagsForPost($post->getId()));
          Proprietary and Confidential
Using Phactory with MongoDB

 require_once 'Phactory/lib/PhactoryMongo.php';

 Uses the Mongo PHP driver
 Almost exactly the same as regular SQL
  Phactory, except:
   » Documents returned as arrays rather than
     Phactory_Row objects
   » Phactory::get() supports all Mongo queries
   » Associations: embedsOne and embedsMany
 http://phactory.org/mongodb-guide/

       © 2009 Vertive, Inc.
       Proprietary and Confidential
QUESTIONS


  © 2009 Vertive, Inc.
  Proprietary and Confidential
Thank You!

These slides are online at
 http://bit.ly/PhactoryWebinar

Contact me on Twitter: @chriskite

Visit http://phactory.org to download and
 for more information

     © 2009 Vertive, Inc.
     Proprietary and Confidential
Phactory
Phactory

More Related Content

PDF
Dependency Injection with PHP and PHP 5.3
PDF
Quebec pdo
PDF
Hidden rocks in Oracle ADF
PDF
Hidden Treasures of the Python Standard Library
PDF
Lithium: The Framework for People Who Hate Frameworks
KEY
Building a Pluggable Plugin
PDF
Dependency injection-zendcon-2010
PDF
Dependency injection in PHP 5.3/5.4
Dependency Injection with PHP and PHP 5.3
Quebec pdo
Hidden rocks in Oracle ADF
Hidden Treasures of the Python Standard Library
Lithium: The Framework for People Who Hate Frameworks
Building a Pluggable Plugin
Dependency injection-zendcon-2010
Dependency injection in PHP 5.3/5.4

What's hot (20)

PPTX
Presentation1
PDF
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
PDF
Database API, your new friend
PDF
PHP Data Objects
PDF
Design how your objects talk through mocking
PDF
Dependency Injection in Laravel
PDF
Deep dive into Oracle ADF
PDF
Top Ten Reasons to Use EntityFieldQuery in Drupal
PDF
Symfony2 from the Trenches
PDF
The State of Lithium
PDF
Doctrine MongoDB Object Document Mapper
PDF
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
PDF
ZendCon2010 Doctrine MongoDB ODM
PDF
購物車程式架構簡介
PDF
Dependency injection - phpday 2010
PDF
Advanced Php - Macq Electronique 2010
PDF
Rails' Next Top Model
PPTX
Ch8(oop)
PDF
Dependency Injection
PDF
Introduction to DI(C)
Presentation1
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Database API, your new friend
PHP Data Objects
Design how your objects talk through mocking
Dependency Injection in Laravel
Deep dive into Oracle ADF
Top Ten Reasons to Use EntityFieldQuery in Drupal
Symfony2 from the Trenches
The State of Lithium
Doctrine MongoDB Object Document Mapper
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
ZendCon2010 Doctrine MongoDB ODM
購物車程式架構簡介
Dependency injection - phpday 2010
Advanced Php - Macq Electronique 2010
Rails' Next Top Model
Ch8(oop)
Dependency Injection
Introduction to DI(C)
Ad

Viewers also liked (8)

PDF
Doctrine2
PDF
Manual doctrine jog
PDF
Susferrin diseno elementos_maquinas
DOCX
Configuracion de mysql
DOCX
Configuracion de mysql
PDF
Doctrine2 enterpice
PPTX
Law of sine and cosines
Doctrine2
Manual doctrine jog
Susferrin diseno elementos_maquinas
Configuracion de mysql
Configuracion de mysql
Doctrine2 enterpice
Law of sine and cosines
Ad

Similar to Phactory (20)

PDF
Unittests für Dummies
PDF
Getting started with TDD - Confoo 2014
PDF
Perforce Object and Record Model
PDF
PHP Machinist Presentation
PPT
Advanced PHPUnit Testing
ODP
PHP Barcelona 2010 - Architecture and testability
PDF
Doctrine for NoSQL
PDF
What is DDD and how could it help you
PDF
Writing Testable Code
PPTX
Efficient working with Databases in LabVIEW - Sam Sharp (MediaMongrels Ltd) -...
PDF
Workshop quality assurance for php projects - phpdublin
PDF
Doctrine and NoSQL
PPT
Zend framework 03 - singleton factory data mapper caching logging
ODP
Codebits 2012 - Fast relational web site construction.
KEY
Hybrid MongoDB and RDBMS Applications
PDF
YoctoDB в Яндекс.Вертикалях
PDF
Zend Framework 1 + Doctrine 2
KEY
MongoDB London PHP
PDF
PHP 5.3 Overview
PPTX
Getting started-php unit
Unittests für Dummies
Getting started with TDD - Confoo 2014
Perforce Object and Record Model
PHP Machinist Presentation
Advanced PHPUnit Testing
PHP Barcelona 2010 - Architecture and testability
Doctrine for NoSQL
What is DDD and how could it help you
Writing Testable Code
Efficient working with Databases in LabVIEW - Sam Sharp (MediaMongrels Ltd) -...
Workshop quality assurance for php projects - phpdublin
Doctrine and NoSQL
Zend framework 03 - singleton factory data mapper caching logging
Codebits 2012 - Fast relational web site construction.
Hybrid MongoDB and RDBMS Applications
YoctoDB в Яндекс.Вертикалях
Zend Framework 1 + Doctrine 2
MongoDB London PHP
PHP 5.3 Overview
Getting started-php unit

Recently uploaded (20)

PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PPTX
Big Data Technologies - Introduction.pptx
PPT
Teaching material agriculture food technology
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Empathic Computing: Creating Shared Understanding
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
Cloud computing and distributed systems.
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
cuic standard and advanced reporting.pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
The Rise and Fall of 3GPP – Time for a Sabbatical?
Reach Out and Touch Someone: Haptics and Empathic Computing
NewMind AI Weekly Chronicles - August'25 Week I
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Big Data Technologies - Introduction.pptx
Teaching material agriculture food technology
Spectral efficient network and resource selection model in 5G networks
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Review of recent advances in non-invasive hemoglobin estimation
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Empathic Computing: Creating Shared Understanding
Mobile App Security Testing_ A Comprehensive Guide.pdf
Cloud computing and distributed systems.
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
cuic standard and advanced reporting.pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Understanding_Digital_Forensics_Presentation.pptx
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...

Phactory

  • 1. A Database Factory for PHP http://phactory.org Chris Kite Sr. Web Engineer at Offers.com © 2009 Vertive, Inc. Proprietary and Confidential @chriskite
  • 2. Phactory: What is it? Alternative to database fixtures for unit tests Define and create objects in code Provides a lightweight ORM Works with MySQL, SQLite, and MongoDB © 2009 Vertive, Inc. Proprietary and Confidential
  • 3. Phactory is developed and used at Offers.com
  • 4. Databases in Unit Testing © 2009 Vertive, Inc. Proprietary and Confidential
  • 5. Database Fixtures A fixture is a statically defined set of data Each test can have its own dataset PHPUnit provides support for loading fixtures: class DatabaseTest extends PHPUnit_Extensions_Database_TestCase { protected function getConnection() { $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', ''); return $this->createDefaultDBConnection($pdo, 'testdb'); } protected function getDataSet() { return $this->createFlatXMLDataSet(dirname(__FILE__).'/_files/bank-account-seed.xml'); } } © 2009 Vertive, Inc. Proprietary and Confidential
  • 6. Database Fixtures <?xml version="1.0" encoding="UTF-8" ?> <dataset> <post post_id="1" title="My First Post" date_created="2008-12-01 12:30:29" contents="This is my first post" rating="5" /> <post post_id="2" title="My Second Post" date_created="2008-12-04 15:35:25" contents="This is my second post" /> </dataset> Vertive, Inc. © 2009 Proprietary and Confidential Example from http://www.phpunit.de/manual/current/en/database.html
  • 7. Database Fixtures Drawbacks: » Typically in an unfriendly format like XML » You are left to your own devices to retrieve and manipulate data in your test » Can’t dynamically create objects » No concept of associations © 2009 Vertive, Inc. Proprietary and Confidential
  • 8. Database Factories Define database test data in code, not flat files Create objects dynamically, rather than loading them all at once Define associations between objects Can integrate with or provide ORM functionality © 2009 Vertive, Inc. Proprietary and Confidential
  • 9. Database Factories Phactory Example <? Phactory::setConnection(new PDO('sqlite:test.db')); Phactory::define('user', array('name' => 'Test User', 'email' => 'user@example.com')); $user = Phactory::create('user'); // creates a row in the 'users' table print("Hello, {$user->name}!"); // prints "Hello, Test User!" © 2009 Vertive, Inc. Proprietary and Confidential
  • 10. Using Phactory © 2009 Vertive, Inc. Proprietary and Confidential
  • 11. Connecting to the Database Phactory supports MySQL, SQLite, and MongoDB Uses PDO for SQL databases <? require_once 'Phactory/lib/Phactory.php'; $pdo = new PDO('mysql:host=127.0.0.1; dbname=testdb', 'user', 'password'); Phactory::setConnection($pdo); © 2009 Vertive, Inc. Proprietary and Confidential
  • 12. Defining Table Blueprints A blueprint defines default values for objects created in a particular table <? Phactory::define('user', array('name' => 'test_user', 'age' => 20)); Phactory::define('post', array('text' => 'This is a post', 'created_at' => 1296663323)); © 2009 Vertive, Inc. Proprietary and Confidential
  • 13. Creating Objects When creating an object with Phactory, you can: » Specify values for fields that weren’t in the blueprint definition » Override any of the default values » Associate with other objects © 2009 Vertive, Inc. Proprietary and Confidential
  • 14. Creating Objects Phactory::define('user', array('name' => 'test_user', 'age' => 20)); $john = Phactory::create('user', array('name' => 'John Doe')); $joe = Phactory::create('user', array('name' => 'Joe Smith', 'activated' => 1)); $anon = Phactory::create('user'); // $john looks like this: $john->id == 1; $john->name == 'John Doe'; $john->activated == 0; // $joe looks like this: $joe->id == 2; $joe->name == 'Joe Smith'; $joe->activated == 1; // $anon looks like this: $anon->id == 3; $anon->name == 'test_user'; $anon->activated == 0; © 2009 Vertive, Inc. Proprietary and Confidential
  • 15. Retrieving Objects Basic ORM functionality allows you to retrieve Phactory objects from the database Uses a simple get() method which takes an array of columns to match $joe = Phactory::get('user', array('id' => 2)); $joe = Phactory::get('user', array('age' => 20, 'activated' => 1)); © 2009 Vertive, Inc. Proprietary and Confidential
  • 16. Associations For SQL databases, Phactory provides many-to-one and many-to-many associations Foreign key columns and join tables are filled in automatically when creating an object with associations © 2009 Vertive, Inc. Proprietary and Confidential
  • 17. Associations Phactory::define('author'); Phactory::define('book', array('name' => 'Test Book'), array('primary_author' => Phactory::manyToOne('author'))); $twain = Phactory::create('author', array('name' => 'Mark Twain')); $book = Phactory::createWithAssociations('book', array('primary_author' => $twain)); $book->author_id == $twain->getId(); © 2009 Vertive, Inc. Proprietary and Confidential
  • 18. Sequences Define blueprints with automatically incrementing values » Include ‘$n’ in the definition » Sequence starts at 0, and is incremented each time an object is created Phactory::define('user', array('name' => 'user$n', 'age' => '$n')); $user0 = Phactory::create('user'); // name == 'user0', age == '0' $user1 = Phactory::create('user'); // name == 'user1', age == '1' $user2 = Phactory::create('user'); // name == 'user2', age == '2' © 2009 Vertive, Inc. Proprietary and Confidential
  • 19. Phactory and PHPUnit © 2009 Vertive, Inc. Proprietary and Confidential
  • 20. Basic Test Setup require_once 'Phactory/lib/Phactory.php'; class ExampleTest extends PHPUnit_Framework_TestCase { public static function setUpBeforeClass() { // create a db connection and tell Phactory to use it $pdo = new PDO("sqlite:test.db"); Phactory::setConnection($pdo); // reset any existing blueprints and empty any tables Phactory has used Phactory::reset(); // define default values for each user we will create Phactory::define('user', array('name' => 'Test User $n', 'age' => 18)); } public static function tearDownAfterClass() { Phactory::reset(); } public function tearDown() { // delete all objects from defined tables, but do not erase blueprints Phactory::recall(); } © 2009 Vertive, Inc. Proprietary and Confidential
  • 21. Structuring Shared Definitions Usually many of the test classes in your suite will need to use the same tables Define blueprints in one place, share them among many tests » Can include() a file of definitions, put definitions in a static class, etc. © 2009 Vertive, Inc. Proprietary and Confidential
  • 22. Structuring Shared Definitions SharedDefinitions.php <? Phactory::define('tag', array('name' => 'Tag $n')); Phactory::define('post', array('name' => 'Test Blog Post', 'content' => 'Test Content'), array('tag' => Phactory::manyToMany('tag', 'posts_tags'))); ExampleTest.php class ExampleTest extends PHPUnit_Framework_TestCase { public static function setUpBeforeClass() { $pdo = new PDO("sqlite:test.db"); Phactory::setConnection($pdo); Phactory::reset(); // include definitions common to several tests include('SharedDefinitions.php'); } } © 2009 Vertive, Inc. Proprietary and Confidential
  • 23. Dynamic Objects Recall that with fixtures, your test data is all loaded at the start of the test With Phactory, you can create or change test data during a test © 2009 Vertive, Inc. Proprietary and Confidential
  • 24. Dynamic Objects class MyPostClass { public static function countTagsForPost($post_id) { $stmt = $pdo->prepare("SELECT COUNT(*) AS num_tags FROM `posts_tags` WHERE `post_id` = ?"); $stmt->execute(array($post_id)); $result = $stmt->fetch(); return $result['num_tags']; } } Phactory::define('tag', array('name' => 'Tag $n'), array('post' => Phactory::manyToMany('post', 'posts_tags'))); Phactory::define('post', array('name' => 'Test Blog Post', 'content' => 'Test Content'), array('tag' => Phactory::manyToMany('tag', 'posts_tags'))); $post = Phactory::create('post'); $this->assertEquals(0, MyPostClass::countTagsForPost($post->getId())); $tag = Phactory::createWithAssociations('tag', array('post' => $post)); © 2009 Vertive, Inc. $this->assertEquals(1, MyPostClass::countTagsForPost($post->getId())); Proprietary and Confidential
  • 25. Using Phactory with MongoDB  require_once 'Phactory/lib/PhactoryMongo.php';  Uses the Mongo PHP driver  Almost exactly the same as regular SQL Phactory, except: » Documents returned as arrays rather than Phactory_Row objects » Phactory::get() supports all Mongo queries » Associations: embedsOne and embedsMany  http://phactory.org/mongodb-guide/ © 2009 Vertive, Inc. Proprietary and Confidential
  • 26. QUESTIONS © 2009 Vertive, Inc. Proprietary and Confidential
  • 27. Thank You! These slides are online at http://bit.ly/PhactoryWebinar Contact me on Twitter: @chriskite Visit http://phactory.org to download and for more information © 2009 Vertive, Inc. Proprietary and Confidential