Home
Doctrine Cookbook
Contents
1. Now lets define our User and link it to the UserAddress model so it can have multiple addresses class User extends Doctrine Record Listing f public function setTableDefinition this gt hasColumn username string 255 this gt hasColumn password string 255 public function setUp this gt hasMany UserAddress as Addresses array local gt id foreign gt record id Now say we have a Company record which also needs ot have many addresses First we need to setup the CompanyAddress child class class CompanyAddress extends Address Listing public function setUp this gt hasOne Company array local gt record id foreign gt id Now lets define our Company and link it to the CompanyAddress model so it can have multiple addresses class Company extends Doctrine Record Listing re public function setTableDefinition 1 this gt hasColumn name string 255 public function setUp id this gt hasMany CompanyAddress as Addresses array local gt foreign gt record_id SENSIOLABS X Listing 6 6 Listing 6 7 Listing 6 8 Listing 6 9 Chapter 6 Taking Advantage of Column Aggregation Inheritance 34 Now both Users and Companies can have multiple addresses and the data is all stored in one address table Now lets create the tables and insert some records Doctrine createTab
2. cccccsssccssssscccesscecesscccssceccesscesesssesessseeees GO Creating a Unit of Work Using Doctrine sccccssccsssccsssccsscesscesssessseees OO Record Based Retrieval Security Template csssccssscsssccssscessccssscessceees 4A ETA SAA AA AA 44 A sesser sree see rrene 44 YAME Schema synta tesieni oa oe E A N E E E 47 SENSIOLABS X Table of Contents iii Using the Template naaa a A eos a a i ea ne ale oe alee ie OO CTY 110 sra EA a a OU cs AAA PP Al r SENSIOLABS X Listing 1 1 Chapter 1 My First Project 4 Chapter 1 My First Project Introduction This is a tutorial amp how to on creating your first project using the fully featured PHP Doctrine ORM This tutorial uses the the ready to go Doctrine sandbox package It requires a web server PHP and PDO Sqlite Download To get started first download the latest Doctrine sandbox package http www phpdoctrine org download Second extract the downloaded file and you should have a directory named Doctrine x x x Sandbox Inside of that directory is a simple example implementation of a Doctrine based web application Package Contents The files directory structure should look like the following cd Doctrine 0 10 1 Sandbox ls config php doctrine index php migrations schema data doctrine php lib models The sandbox does not require any configuration it comes ready to use with a sqlite database Below is a descripti
3. REQUEST action list if module users 4 userld isset REQUEST id amp amp REQUEST id gt O REQUEST id null userTable Doctrine getTable User if userId null user new User else user userTable gt find userld switch action case edit case add echo lt form action index php module users amp action save method POST gt lt fieldset gt lt legend gt User lt legend gt lt input type hidden name id value user gt id u J gt lt label for username gt Username lt label gt lt input type text name user username value user gt username gt lt label for password gt Password lt label gt lt input type text name user password value user gt password gt lt input type submit name save value Save gt lt fieldset lt form gt break case save user gt merge REQUEST user user gt save header location index php module users amp action edit amp id user gt id break case delete user gt delete SENSIOLABS X Chapter 1 My First Project 10 header location index php module users amp action List break default query new Doctrine Query query gt from User u gt orderby u username users query gt execute echo lt ul gt foreach users as user echo lt li gt lt a href index php module users amp action
4. apply to branch manager Salesperson through Salesperson UserSalesperson field user id apply to salesperson District through Branch District UserDistrict field user id apply to district manager columns id type integer 4 primary true autoincrement true unsigned true parent id type integer 4 primary false autoincrement false unsigned true business class id type integer 2 unsigned true salesperson id type integer 4 unsigned true branch id type integer 4 unsigned true division id type integer 1 unsigned true sold to type integer 4 unsigned true Division columns id type integer 1 autoincrement true primary true unsigned true name type string 32 code type string 4 District actAs gsSecurityTemplate conditions Division through Division UserDivision field user_id apply to division manager relations Division foreignAlias Districts local division_id SENSIOLABS gt Chapter 9 Record Based Retrieval Security Template 48 onDelete RESTRICT columns id type integer 4 autoincrement true primary true unsigned true name type string 64 code type string 4 division id type integer 1 unsigned true Branch actAs gsSecurityTemplate conditions Division through Division UserDivision field user_id apply to division manager
5. doctrine Doctrine Cookbook Everyday recipes for everyday Doctrine users Doctrine 1 0 License Creative Commons Attribution Share Alike 3 0 Unported License Version cookbook 1 0 dql doctrine query language 2010 04 25 SENSIOLABS X Table of Contents ii Table of Contents My First POU PAP gen e PO PO O O A WTA OCU C A A T A ebanicenmauamengiameedswaecs 4 DOWN upon AA NAAA R E E INS 4 Package COMES ia 4 R nning AA A ESAE EESE 5 Defining CIN I dai 5 Test Data FIXtUTOS endorsed 6 B ildin Everything Aoi 6 RUNNING ESS nia 7 User CRUD puna AAN AAA ON 9 f symfony and Doctrine ar LL SCUD ieser E O E EOE TE T E A 11 Setup Database nr atada 12 S tup Schema ieseni ionia eia O T T d 12 Build Database 13 Admin Generators A Gail a ekaa ANORA rera aie aE EEEN 14 Helpful LINKS ran aa a g oa 15 f symfony and Doctrine Migrations essesssosseosossesssosscossossesssosseossosseossossessse L7 Setting up your database aia et 17 Denn your SCHEMA aaa aia 17 B ild Data Dalt 18 Setup Migration ida 19 R D Migration siseses O aE Na TE E a 22 Code Igniter and Doctrine ansiada Z Download Doctrine ande 24 SGUD DOSIS da dados 24 Setup Command Line Interface animada aaa 25 Start Using DOS ad Ai 27 Plug and Play Schema Information With Templates csssscsssssseseeees OO Taking Advantage of Column Aggregation Inheritance csssscesssesssees IZ Master and Slave Connections
6. doctrine build all doctrine build all load doctrine build all reload doctrine compile doctrine create db doctrine create tables doctrine dql doctrine drop db doctrine dump data doctrine generate migration doctrine generate migrations db doctrine generate migrations models doctrine generate models db doctrine generate models yaml doctrine generate sql doctrine generate yaml db doctrine generate yaml models doctrine load data doctrine migrate doctrine rebuild db On Microsoft Windows call the script via the PHP binary because the script won t invoke it automatically Listing php exe doctrine SENSIOLABS X Chapter 4 Code Igniter and Doctrine Start Using Doctrine 27 It is simple to start using Doctrine now First we must create a yaml schema file save it at schema with filename like user yml User columns id primary true autoincrement true type integer 4 username string 255 password string 255 relations Groups class Group class name local user id foreign group id refClass UserGroup foreignAlias Users hasMany Users Group tableName groups columns id primary true autoincrement true type integer 4 name string 255 UserGroup columns user id type integer 4 primary true group id type integer 4 primary true relations User local user id foreign id onDelete CASCADE Group local group id foreign id
7. District through District UserDistrict field user_id apply to district manager relations Division local division_id foreignAlias Branches onDelete CASCADE District foreignAlias Branches local district_id onDelete RESTRICT columns id type integer 4 primary true autoincrement true unsigned true name type string 64 code type string 4 district id type integer 4 unsigned true division id type integer 1 unsigned true is active type boolean default true User relations Divisions class Division refClass UserDivision local user id foreign division id Districts class District refClass UserDistrict local user id foreign district_id Branches class Branch refClass UserBranch local user id foreign branch_id Salespersons class Salesperson refClass UserSalesperson SENSIOLABS X Chapter 9 Record Based Retrieval Security Template 49 local user id foreign salespersons id columns id type integer 4 autoincrement true primary true unsigned true name type string 128 is admin type boolean default false is active type boolean default true is division manager type boolean default false is district manager type boolean default false is branch manager type boolean default false is salesperson type boolean default false last login type timestamp UserDivision
8. SENSIOLABS gt Chapter 1 My First Project 7 build all reload Successfully dropped database for connection sandbox at path Users jwage Sites doctrine branches 0 10 tools sandbox sandbox db build all reload Generated models successfully from YAML schema build all reload Successfully created database for connection sandbox at path Users jwage Sites doctrine branches 0 10 tools sandbox sandbox db build all reload Created tables successfully build all reload Data was successfully loaded Take a peak in the models folder and you will see that the model classes were generated for you Now you can begin coding in your index php to play with Doctrine itself Inside index php place some code like the following for a simple test Running Tests query new Doctrine Query Listing query gt from User u u Groups g users query gt execute echo lt pre gt print _r users gt toArray true The print r should output the following data You will notice that this is the data that we populated by placing the yaml file in the data fixtures files You can add more data to the fixtures and rerun the build all reload command to reinitialize the database pi Liting 0 gt Array id gt 1 username gt zYne password gt changeme Groups gt Array 0 gt Array id gt 1 name gt Founder 1 gt Array id gt 2 name gt Lead 2 g
9. First we must define the template so that we can use it in our Doctrine classes class Doctrine Template Address extends Doctrine Template public function setTableDefinition this gt hasColumn address1 string 255 this gt hasColumn address2 string 255 this gt hasColumn address3 string 255 this gt hasColumn city string 255 this gt hasColumn state string 2 this gt hasColumn zipcode string 15 Now that we have our template defined lets define some basic models that need to have address attributes added to them Lets start first with a User class User extends Doctrine Record public function setTableDefinition this gt hasColumn username string 255 this gt hasColumn password string 255 public function setUp SENSIOLABS X Chapter 5 Plug and Play Schema Information With Templates 31 this gt actAs Address Now we also have a Company model which also must contain an address class Company extends Doctrine Record Listing public function setTableDefinition this gt hasColumn name string 255 this gt hasColumn description clob public function setUp this gt actAs Address Now lets generate the SQL to create the tables for the User and Company model You will see that the attributes from the template are automatically added to each table CREATE TABLE user id BIGINT AUTO INC
10. Jonathan H Wage 23 If you compare the data returned here to the data that was returned in the beginning of this tutorial you will see that the author column was removed and migrated to an Author model SENSIOLABS X Listing 4 1 Listing 4 2 Listing 4 3 Listing 4 4 Chapter 4 Code Igniter and Doctrine 24 Chapter 4 Code Igniter and Doctrine This tutorial will get you started using Doctrine with Code Igniter Download Doctrine First we must get the source of Doctrine from svn and place it in the system database folder cd system database svn co http svn phpdoctrine org branches 11 lib doctrine cd If you use svn in your project you can set Doctrine as an external so you receive bug fixes automatically from svn svn propedit svn externals database In your favorite editor add the following line doctrine http svn phpdoctrine org branches 0 11 lib Setup Doctrine Now we must setup the configuration for Doctrine and load it in system application config database php vi application config database php The code below needs to be added under this line of code db default cachedir Add this code Create dsn from the info above db default dsn db default dbdriver db default username db default password db default hostname db default database Require Doctrine php require once realp
11. gsSecurityListener setUserId this gt getAttribute user id gsSecurityListener setCredentials this gt listCredentials This provides the credentials the user was given when they logged in as well as their id User setup In my case I create users and provide a checkbox for their credentials one for each type I have Lets take Division Manager as an example In my case we have 3 divisions East Central West When I create a user I assign it the West division and check off that they are a division manager I can then proceed to login and my account listing page will restrict the accounts I see automatically to my division Querying Now if you query the Account model the template is triggered and based on your credentials the results will be restricted The query below accounts Doctrine Query create gt from Account a gt leftJoin a Branches b gt where a company name LIKE A gt execute produces the resulting sql SELECT FROM accounts a2 LEFT JOIN branches b2 ON a2 branch id b2 id SENSIOLABS X Chapter 9 Record Based Retrieval Security Template 51 LEFT JOIN divisions d2 ON a2 division id d2 id LEFT JOIN user divisions u2 ON d2 id u2 division_ id WHERE a2 company name LIKE AND u2 user_id ORDER BY a2 company name The results you get back will always be restricted to the division you have been assigned Since in our schema we ve defined restrictions on the Bran
12. tableName user divisions columns id type integer 4 autoincrement true primary true unsigned true user id type integer 4 primary true unsigned true division id type integer 1 primary true unsigned true UserDistrict tableName user districts columns id type integer 4 autoincrement true primary true unsigned true user id type integer 4 primary true unsigned true district id type integer 4 primary true unsigned true UserBranch tableName user branches columns id type integer 4 autoincrement true primary true unsigned true user id type integer 4 primary true unsigned true branch id type integer 4 primary true unsigned true UserSalesperson tableName user salespersons columns id type integer 4 autoincrement true primary true unsigned true user id type integer 4 primary true unsigned true salespersons id type integer 4 primary true unsigned true You can see from the User model that the credentials are set within the db All hardcoded in this situation Using the template Once you ve built your models from the schema you should see something like the following in your model s setUp function gssecuritytemplate0 new gsSecurityTemplate array conditions gt Listing array Division gt array through gt array 0 gt Division 1 gt SENSIOLABS X Listing 9 4
13. tables Now lets do a little playing around with the data to see how we can use the Doctrine Query Language to retrieve data php symfony doctrine dql frontend FROM BlogPost p p Tags t gt gt doctrine executing FROM BlogPost p p Tags t gt gt doctrine gt gt doctrine id 1 gt gt doctrine title symfony Doctrine gt gt doctrine body symfony and Doctrine are great gt gt doctrine author Jonathan H Wage gt gt doctrine slug symfony doctrine gt gt doctrine created at 2008 06 16 12 28 57 gt gt doctrine updated at 2008 06 16 12 28 57 gt gt doctrine Tags gt gt doctrine gt gt doctrine id 1 gt gt doctrine name symfony gt gt doctrine created at 2008 06 16 12 28 57 gt gt doctrine updated at 2008 06 16 12 28 57 gt gt doctrine gt gt doctrine id 2 gt gt doctrine name doctrine gt gt doctrine created at 2008 06 16 12 28 57 gt gt doctrine updated at 2008 06 16 12 28 57 gt gt doctrine gt gt doctrine id 3 gt gt doctrine name php gt gt doctrine created at 2008 06 16 12 28 57 gt gt doctrine updated at 2008 06 16 12 28 57 Now lets do a little explaining of the data that was returned As you can see the models have a created at updated at and slug column which were not defined in the schema files These columns are added by the behaviors attached to the schema information under the actAs setting The created at and updated a
14. yml and setup your mysql database Copy and paste the yaml below in to the file artes Listing 3 2 all doctrine class sfDoctrineDatabase param dsn mysql Define your schema In this example we are going to use a traditional Blog model Open config doctrine schema yml and copy and paste the yaml contents from below in to the file Listing BlogPost actAs Sluggable fields title columns SENSIOLABS X Chapter 3 symfony and Doctrine Migrations 18 title string 255 body clob author string 255 relations Tags class Tag refClass BlogPostTag foreignAlias BlogPosts BlogPostTag columns blog post id type integer primary true tag_id type integer primary true Tag columns name string 255 Place the below data fixtures in to data fixtures data yml BlogPost BlogPost_1 slug symfony doctrine author Jonathan H Wage title symfony Doctrine body symfony and Doctrine are great Tags symfony doctrine php Tag symfony name symfony doctrine name doctrine php name php Build Database Now with one simple command Doctrine is able to create the database the tables and load the data fixtures for you Doctrine works with any PDO http www php net pdo driver and is able to drop and create databases for any of them symfony doctrine build all reload frontend gt gt doctrine Are you sure you wish to drop your databases y n gt gt doctr
15. Listing 9 5 Listing 9 6 Chapter 9 Record Based Retrieval Security Template 50 UserDivision field gt user id apply to gt array 0 gt division manager exclude for gt array 0 gt admin Branch gt array through gt array 0 gt Branch 1 gt UserBranch field gt user_id apply to gt array 0 gt branch_manager exclude for gt array 0 gt admin 1 gt division manager 2 gt district manager Salesperson gt array through gt array 0 gt Salesperson 1 gt UserSalesperson field gt user id apply to gt array 0 gt salesperson exclude for gt array 0 gt admin 1 gt division manager 2 gt district manager 3 gt branch manager District gt array through gt array 0 gt Branch 1 gt District 2 gt UserDistrict field gt user id apply to gt array 0 gt district manager exclude for gt array 0 gt admin 1 gt division manager this gt actAs gssecuritytemplate0 The last part you need to use is to provide the template with the running user s credentials and id In my project s session bootstrapping I have the following 1 use the symfony MVC framework public function initialize context parameters null parent initialize context parameters null
16. REMENT Listig username VARCHAR 255 g password VARCHAR 255 address1l VARCHAR 255 address2 VARCHAR 255 address3 VARCHAR 255 city VARCHAR 255 state VARCHAR 2 zipcode VARCHAR 15 PRIMARY KEY id ENGINE INNODB CREATE TABLE company id BIGINT AUTO INCREMENT name VARCHAR 255 description LONGTEXT address1l VARCHAR 255 address2 VARCHAR 255 address3 VARCHAR 255 city VARCHAR 255 state VARCHAR 2 zipcode VARCHAR 15 PRIMARY KEY id ENGINE INNODB That s it Now you can maintain your Address schema information from one place and use the address functionality in as many places as you like SENSIOLABS gt Lis 6 1 ting Chapter 6 Taking Advantage of Column Aggregation Inheritance 32 Chapter 6 Taking Advantage of Column Aggregation Inheritance First let me give a brief explanation of what column aggregation inheritance is and how it works With column aggregation inheritance all classes share the same table and all columns must exist in the parent Doctrine is able to know which class each row in the database belongs to by automatically setting a type column so that Doctrine can cast the correct class when hydrating data from the database Even if you query the top level column aggregation class the collection will return instances of the class that each row belongs to Now that you have a basic understand of column aggregation inheritance lets put it to use In this example we wil
17. add the following code somewhere user new User Listing 1 1 4 19 user gt username zYne user gt setPassword password user gt save userTable Doctrine getTable User user userTable gt find0neByUsername zYne echo user gt username prints zYne users userTable gt retrieveAll echo users gt count echo 2 foreach users as user echo user gt username SENSIOLABS X Listing 5 1 Listing 5 2 Chapter 5 Plug and Play Schema Information With Templates 30 Chapter 5 Plug and Play Schema Information With Templates Doctrine templates essentially allow you to extract schema information so that it can be plugged in to multiple Doctrine classes without having to duplicate any code Below we will show some examples of what a template could be used for and how it can make your schema easier to maintain Let s get started Imagine a project where you have multiple records which must have address attributes Their are two basic approaches to solving this problem One is to have a single table to store all addresses and each record will store a foreign key to the address record it owns This is the normalized way of solving the problem The de normalized way would be to store the address attributes with each record In this example a template will extract the attributes of an address and allow you to plug them in to as many Doctrine classes as you like
18. ath dirname _ FILE DIRECTORY SEPARATOR database doctrine Doctrine php SENSIOLABS gt Chapter 4 Code Igniter and Doctrine 25 Set the autoloader spl_autoload register array Doctrine autoload Load the Doctrine connection Doctrine Manager connection db default dsn db default database Set the model loading to conservative lazy loading Doctrine Manager getInstance gt setAttribute model loading conservative Load the models for the autoloader Doctrine loadModels realpath dirname FILE DIRECTORY SEPARATOR models Now we must make sure system application config database php is included in your front controller Open your front controller in your favorite text editor cd vi index php Change the last 2 lines of code of index php with the following require once APPPATH config database php require once BASEPATH codeigniter CodeIgniter EXT Setup Command Line Interface Create the following file system application doctrine and chmod the file so it can be executed Place the code below in to the doctrine file vi system application doctrine Place this code in system application doctrine usr bin env php define BASEPATH mockup that this app was executed from ci chdir dirname _ FILE include doctrine php Now create the following file system application doctrine php Place the code below in to the d
19. ch and Districts as well if I were to want to provide a user with a drop down of potential branches I can simply query the branches as I normally would and only the ones in my division would be returned to choose from Restrictions For the time being this module only protects tables in the FROM clause since doctrine currently runs the query listener for the new tables added to the query by the template and thus we get a pretty nasty query in the end that doesn t work If I can figure out how to detect such situations reliably I ll update the article SENSIOLABS X
20. d type integer primary true tag_id type integer primary true Tag actAs Timestampable columns name string 255 Now that we have our Doctrine schema defined lets create some test data fixtures in data fixtures data yml Open the file in your favorite editor and paste the below YAML in to the file ere Listing BlogPost BlogPost_1 title symfony Doctrine body symfony and Doctrine are great author Jonathan H Wage Tags symfony doctrine php Tag symfony name symfony doctrine name doctrine php name php Build Database Ok now for the fun stuff We have our schema and we have some data fixtures so lets run one single Doctrine command and create your database generate your models create tables and load the data fixtures php symfony doctrine build all reload frontend Listing gt gt doctrine Are you sure you wish to drop your databases y n y gt gt doctrine Successfully dropped database f 1 1Doctrine config doctrine db SENSIOLABS X Listing 2 8 Listing 2 9 Chapter 2 symfony and Doctrine 14 gt gt doctrine Successfully created database f 1 1Doctrine config doctrine db gt gt doctrine Generated models successfully gt gt doctrine Created tables successfully gt gt doctrine Data was successfully loaded Now your doctrine db SQLite database is created all the tables for your schema were created and the data fixtures were populated in to the
21. dit _delete edit display author title body Tags fields author type input tag title type input tag body type textarea_tag params size 50x10 Tags type doctrine admin check list params through class BlogPostTag Now refresh the blog post list and you will see it is cleaned up a little bit Edit a blog post by clicking the edit icon or the title and you can see below you can check the tags associated to the blog post All of the features you get in Propel work 99 the same way with Doctrine so it should be fairly easy to get the hang of if you are coming from propel sfDoctrinePlugin implements all the same functionality as sfPropelPlugin as well as several additional features which sfPropelPlugin is not capable of Below you can find some more information on the major features that Doctrine supports Helpful Links e Behaviors http www phpdoctrine org documentation manual 01 1 chapter plugins Easily create reusable behaviors for your Doctrine models e Migrations http www phpdoctrine org documentation manual 0 11 chapter migration Deploy database schema changes to your production environment through a programmatic interface 3 2 http www phpdoctrine org documentation manual 0 11 chapter plugins 3 http www phpdoctrine org documentation manual O 11 chapter migration SENSIOLABS gt Chapter 2 symfony and Doctrine Doctrine Query Language http www phpdoctrine org documentat
22. e model already belong to the delete collection foreach this gt deleteCollection as m if model gt getOid m gt getOid return true return false Now we can add our public methods that will be used by code outside of the UnitOfWork public function registerModelForCreateOrUpdate model Listing 3 code to check to see if the model exists already if this gt existsInCollections model throw new Exception model already in another collection for this transaction no add it this gt createOrUpdateCollection model public function registerModelForDelete model 1 code to check to see if the model exists already if this gt existsInCollections model throw new Exception model already in another collection for this transaction no add it this gt deleteCollection model Before we write the transaction code we should also be able to let other code clear the Unit Of Work We ll use this method internally as well in order to flush the collections after our transaction is succesful public function clearAll Listing 8 6 this gt _deleteCollection array SENSIOLABS X Listing 8 7 Listing 8 8 Listing 8 9 Chapter 8 Creating a Unit of Work Using Doctrine 40 this gt createOrUpdateCollection array With skeleton in place we can now write the code that performs the Doctrine transaction public function c
23. edit amp id user gt id gt user gt username lt a gt amp nbsp lt a href index php module users amp action delete amp id user gt id gt X lt a gt lt li gt echo lt ul gt echo lt ul gt lt li gt lt a href index php module usersgaction add gt Add lt a gt lt li gt lt li gt lt a href index php module users amp action List gt List lt a gt lt li gt lt ul gt else throw new Exception Invalid module SENSIOLABS X Chapter 2 symfony and Doctrine 11 Chapter 2 symfony and Doctrine So you want to give Doctrine a try with symfony 1 1 eh First we will need to setup a new symfony 1 1 project and install the sfDoctrinePlugin for 1 1 Execute the following commands below and continue reading Setup mkdir symfony1 1Doctrine Listing cd symfonyl 1Doctrine path to symfony generate project symfonyl 1Doctrine svn co http svn symfony project com plugins sfDoctrinePlugin trunk plugins sfDoctrinePlugin php symfony cc Now type the following command to list all the new commands that sfDoctrinePlugin provides You will notice that it gives you all the same commands as sfPropelPlugin and lots more php symfony list doctrine Listing Available tasks for the doctrine namespace build all Generates Doctrine model SQL and initializes the database doctrine build all build all load Generates Doctrine model SQL initializes databa
24. ery instead of Doctrine Query public static function create conn null return new MyQuery conn public function preQuery If this is a select query then set connection to one of the slaves if this gt getType Doctrine Query SELECT this gt conn Doctrine Manager getInstance gt getConnection slave rand 1 4 All other queries are writes so they need to go to the master SENSIOLABS gt Listing 7 3 Listing 7 4 Listing 7 5 Chapter 7 Master and Slave Connections 36 else this gt conn Doctrine Manager getInstance gt getConnection master Now we have queries taken care of but what about when saving records We can force the connection for writes to the master by overriding Doctrine Record and using it as the base for all of our models abstract class MyRecord extends Doctrine Record public function save Doctrine Connection conn null If specific connection is not provided then lets force the connection to be the master if conn null conn Doctrine Manager getInstance gt getConnection master parent save conn All done Now reads will be distributed to the slaves and writes are given to the master connection Below are some examples of what happens now when querying and saving records First we need to setup a model to test with class User extends MyRecord public function setTableDefinition thi
25. ine Successfully dropped database f 1 1Doctrine config doctrine db gt gt doctrine Successfully created database f 1 1Doctrine config 15 http www php net pdo SENSIOLABS YY Chapter 3 symfony and Doctrine Migrations 19 doctrine db gt gt doctrine Generated models successfully gt gt doctrine Created tables successfully gt gt doctrine Data was successfully loaded Now your database models and tables are created for you so easily Lets run a simple DQL query to see the current data that is in the database so we can compare it to the data after the migration has been performed symfony doctrine dql frontend FROM BlogPost p p Tags t Listing gt gt doctrine executing FROM BlogPost p p Tags t gt gt doctrine gt gt doctrine id 1 gt gt doctrine title symfony Doctrine gt gt doctrine body symfony and Doctrine are great gt gt doctrine author Jonathan H Wage gt gt doctrine slug symfony doctrine gt gt doctrine Tags gt gt doctrine gt gt doctrine id 1 gt gt doctrine name symfony gt gt doctrine gt gt doctrine id 2 gt gt doctrine name doctrine gt gt doctrine gt gt doctrine id 3 gt gt doctrine name php Setup Migration Now what if a few months later you want to change the schema to split out the BlogPost author column to an Author model that is related to BlogPost author id First lets add the new model to your config doctr
26. ine schema yml Replace your schema yaml with the schema information from below saa Listing 3 7 BlogPost actAs Sluggable fields title columns title string 255 body clob author string 255 author_id integer relations Author foreignAlias BlogPosts Tags class Tag refClass BlogPostTag foreignAlias BlogPosts BlogPostTag columns SENSIOLABS gt Listing 3 8 Listing 3 9 Listing 3 10 Chapter 3 symfony and Doctrine Migrations 20 blog post id type integer primary true tag_id type integer primary true Tag columns name string 255 Author columns name string 255 Rebuild your models now with the following command symfony doctrine build model gt gt doctrine Generated models successfully As you see we have added a new Author model and changed the author column to author id and integer for a foreign key to the Author model Now lets write a new migration class to upgrade the existing database without losing any data Run the following commands to create skeleton migration classes in lib migration doctrine You will see a file generated named 001 add author class php and 002 migrate author class php Inside them are blank up and down method for you to code your migrations for the schema changes above symfony doctrine generate migration frontend AddAuthor gt gt doctrine Generated migration class AddA Doctrine lib migration doctrine s
27. ion manual 01 1 chapter dql doctrine query language Build your database queries through a fluent OO interface Validators http www phpdoctrine org documentation manual 0 11 chapter basic schema mapping constraints and validators Turn on column validators for both database and code level validation Hierarchical Data http www phpdoctrine org documentation manual 01 1 chapter hierarchical data Turn your models in to nested sets easily with the flip of a switch Caching http www phpdoctrine org documentation manual 0 1 1 chapter caching Tune performance by caching your DQL query parsing and the result sets of queries 16 If this short tutorial sparked your interest in Doctrine you can check out some other Doctrine resources below to learn more about Doctrine Full User Manual http www phpdoctrine org documentation manual 0 11 one page API Documentation http www phpdoctrine org documentation api 0 11 E Cheatsheet http www phpdoctrine org Doctrine Cheat Sheet pdf Blog http www phpdoctrine org blog Community http www phpdoctrine org community Frequently Asked Questions http www phpdoctrine org faq Download http www phpdoctrine org download 4 http ww phpdoctrine org documentation manual 0 11 chapter dql doctrine query Language 5 http www phpdoctrine org documentation manual 0 11 chapter basic schema mapping constraints and validators 6 http www phpd
28. l setup some models which will allow us to use one address table for storing all of our addresses across the entire application Any record will be able to have multiple addresses and all the information will be stored in one table First lets define our Address class Address extends Doctrine Record public function setTableDefinition 1 this gt hasColumn address1 string 255 this gt hasColumn address2 string 255 this gt hasColumn address3 string 255 this gt hasColumn city string 255 this gt hasColumn state string 2 this gt hasColumn zipcode string 15 this gt hasColumn type string 255 this gt hasColumn record_id integer this gt option export tables this gt setSubClasses array UserAddress gt array type gt UserAddress CompanyAddress gt array type gt CompanyAddress Note the option set above to only export tables because we do not want to export any foreign key constraints since record id is going to relate to many different records We are going to setup a User so it can have multiple addresses so we will need to setup a UserAddress child class that User can relate to SENSIOLABS gt Chapter 6 Taking Advantage of Column Aggregation Inheritance 33 class UserAddress extends Address Listing 2 public function setUp this gt hasOne User array local gt record id foreign gt id
29. lesFromArray array User Company Address user new User user gt username jwage user gt password changeme user gt Addresses 0 gt addressl 123 Road Dr user gt Addresses 0 gt city Nashville user gt Addresses 0 gt state TN user gt save company new Company company gt name centre source company gt Addresses 0 gt address1 123 Road Dr company gt Addresses 0 gt city Nashville company gt Addresses 0 gt state TN company gt save Query for the user and its addresses users Doctrine Query create gt from User u gt leftJoin u Addresses a gt execute echo users 0 gt username jwage echo users 0 gt Addresses 0 gt addressl1 123 Road Dr echo get_class users 0 gt Addresses 0 UserAddress Query for the company and its addresses companies Doctrine Query create gt from Company c gt leftJoin c Addresses a gt execute echo companies 0 gt name centre source echo companies 0 gt Addresses 0 gt addressl 123 Road Dr echo get_class companies 0 gt Addresses 0 CompanyAddress Now lets query the Addresses directly and you will notice each child record returned is hydrated as the appropriate child class that created the record initially addresses Doctrine Query create gt from Address a gt execute echo get_class addresses 0 Use
30. n model already in another collection for this transaction no add it SENSIOLABS X Chapter 8 Creating a Unit of Work Using Doctrine 42 this gt deleteCollection model Jer Clear the Unit of Work public function ClearAll this gt _deleteCollection array this gt createOrUpdateCollection array Perform a Commit and clear the Unit Of Work Throw an Exception if it fails and roll back ed public function commitALl conn Doctrine Manager connection try conn gt beginTransaction this gt performCreatesOrUpdates conn this gt performDeletes conn conn gt commit catch Doctrine Exception e conn gt rollback this gt clearALl protected function _performCreatesOrUpdates conn foreach this gt createOrUpdateCollection as model model gt save conn protected function _performDeletes conn foreach this gt deleteCollection as model model gt delete conn protected function existsInCollections model foreach this gt createOrUpdateCollection as m if model gt get0id m gt getOid return true foreach this gt deleteCollection as m if model gt get0id m gt getOid SENSIOLABS X Chapter 8 Creating a Unit of Work Using Doctrine 43 return true return false Thanks for reading feel free to check ou
31. n UPDATE lastProjects 0 gt name old project unitOfWork gt registerModelForCreateOrUpdate lastProjects 0 prepare a CREATE project new Project project gt name new project name SENSIOLABS X Chapter 8 Creating a Unit of Work Using Doctrine 41 unitOfWork gt registerModelForCreateOrUpdate project prepare a DELETE unitOfWork gt registerModelForDelete lastProjects 3 perform the transaction unitOfWork gt commitALl The end result should look like this class UnitOfWork Listing 8 10 Collection of models to be persisted var array Doctrine Record protected createOrUpdateCollection array Collection of models to be persisted x var array Doctrine Record protected deleteCollection array Jer Add a model object to the create collection param Doctrine Record model 7 public function registerModelForCreateOrUpdate model code to check to see if the model exists already if this gt existsInCollections model throw new Exception model already in another collection for this transaction no add it this gt createOrUpdateCollection model Jer Add a model object to the delete collection param Doctrine Record model 7 public function registerModelForDelete model 1 code to check to see if the model exists already if this gt existsInCollections model throw new Exceptio
32. nction _ construct array options if isset options conditions empty options conditions throw new Doctrine Exception Unable to create security template without conditions SENSIOLABS X Chapter 9 Record Based Retrieval Security Template 45 this gt options options public function setUp this gt addListener new gsSecurityListener this gt options class gsSecurityListener extends Doctrine Record Listener private static user id 0 credentials alias count array 30 protected options array construct param string options return void e public function _construct array options this gt options options public function preDqlSelect Doctrine Event event invoker event gt getInvoker class get class invoker params event gt getParams if class params alias return q event gt getQuery only apply to the main protected table not chained tables may break some situations if q gt contains FROM class return wheres array pars array from q gt getDqlPart from foreach this gt options conditions as rel_ name gt conditions apply false foreach conditions apply to as val if in array val self credentials SENSIOLABS gt Chapter 9 Record Based Retrieval Security Template 46 apply true b
33. octrine org documentation manual O 11 chapter hierarchical data 7 http www phpdoctrine org documentation manual 0 11 chapter caching 8 http www phpdoctrine org documentation manual 0 11 0ne page 9 http www phpdoctrine org documentation api O 11 10 11 12 13 14 http www phpdoctrine org Doctrine Cheat Sheet pdf http www phpdoctrine org blog http www phpdoctrine org community http www phpdoctrine org faq http www phpdoctrine org download SENSIOLABS X Chapter 3 symfony and Doctrine Migrations 17 Chapter 3 symfony and Doctrine Migrations The PHP Doctrine ORM offers a fully featured database migration utility that makes it easy to upgrade your databases for both schema and data changes without having to manually write or keep up with SQL statements Database migrations essentially allow you to have multiple versions of your schema A single Doctrine migration class represents one version of the schema Each migration class must have an up and a down method defined and the down must negate everything done in the up method Below I will show you an example of how to use Doctrine to control your database This tutorial is written for symfony 1 1 but the same functionality exists Listing for the 1 0 version of sfDoctrinePlugin but in the 1 0 style task system Setting up your database First thing we need to do is define your database and create it Edit config databases
34. octrine php file require once config database php Configure Doctrine Cli Normally these are arguments to the cli tasks but if they are set here the arguments will be auto filled config array data fixtures path gt dirname _ FILE DIRECTORY SEPARATOR fixtures models path gt dirname _ FILE_ DIRECTORY SEPARATOR models migrations path gt dirname _ FILE_ DIRECTORY SEPARATOR migrations sql_path gt dirname __FILE_ SENSIOLABS gt Listing 4 5 Listing 4 6 Listing 4 7 Listing 4 8 Listing 4 9 Chapter 4 Code Igniter and Doctrine 26 DIRECTORY SEPARATOR sql yaml_schema_path gt dirname __FILE_ DIRECTORY SEPARATOR schema cli new Doctrine Cli config cli gt run SERVER argv Now we must create all the directories for Doctrine to use Listing Create directory for your yaml data fixtures files mkdir system application fixtures Create directory for your migration classes mkdir system application migrations Create directory for your yaml schema files mkdir system application schema Create directory to generate your sql to create the database in mkdir system application sql Now you have a command line interface ready to go If you execute the doctrine shell script with no argument you will get a list of available commands Listing cd system application doctrine Doctrine Command Line Interface
35. ommitALl i conn Doctrine Manager connection try conn gt beginTransaction this gt performCreatesOrUpdates conn this gt performDeletes conn conn gt commit catch Doctrine Exception e conn gt rollback this gt clearAll Now we re assuming that we ve already started a Doctrine connection In order for this object to work we need to initialize Doctrine It s often best to put this kind of code in a config php file which is loaded once using require once define SANDBOX_PATH dirname __FILE_ define DOCTRINE PATH SANDBOX PATH DIRECTORY SEPARATOR lib define MODELS PATH SANDBOX PATH DIRECTORY SEPARATOR models define YAML SCHEMA PATH SANDBOX PATH DIRECTORY SEPARATOR schema define DB PATH mysql root fGlocalhost database require once DOCTRINE PATH DIRECTORY SEPARATOR Doctrine php spl_autoload register array Doctrine autoload Doctrine Manager getInstance gt setAttribute model loading conservative connection Doctrine Manager connection DB PATH main Doctrine LoadModels MODELS PATH With all that done we can now invoke the Unit of Work to perform a whole range of operations in one clean transaction without adding complexity to the rest of our code base t Doctrine getTable Project lastProjects t gt findByName new project unitOfWork new UnitOfWork prepare a
36. on of each of the files directories and what its purpose is e doctrine Shell script for executing the command line interface Run with doctrine to see a list of command or Idoctrine help to see a detailed list of the commands e doctrine php Php script which implements the Doctrine command line interface which is included in the above doctrine 1 http ww phpdoctrine org download SENSIOLABS gt Chapter 1 My First Project 5 shell script index php Front web controller for your web application e migrations Folder for your migration classes e schema Folder for your schema files e models Folder for your model files e lib Folder for the Doctrine core library files Running the CLI If you execute the doctrine shell script from the command line it will output the following doctrine Listing Doctrine Command Line Interface i doctrine build all doctrine build all load doctrine build all reload doctrine compile doctrine create db doctrine create tables doctrine dql doctrine drop db doctrine dump data doctrine generate migration doctrine generate migrations db doctrine generate migrations models doctrine generate models db doctrine generate models yaml doctrine generate sql doctrine generate yaml db doctrine generate yaml models doctrine load data doctrine migrate doctrine rebuild db Defining Schema Below is a sample yaml schema file to get sta
37. onDelete CASCADE Listing 4 13 Class name Optional if alias is the Local Foreign xRefClass for relating Users to Groups Opposite relationship alias Group Local key Foreign key Database constraint Now if you run the following command it will generate your models in system application models doctrine generate models yaml Listing generate models yaml Generated models successfully from YAML schema 4 14 SENSIOLABS X Chapter 4 Code Igniter and Doctrine 28 Now check the file system application models generated BaseUser php You will see a compclass definition like below Listing t This class has been auto generated by the Doctrine ORM Framework 7 abstract class BaseUser extends Doctrine Record public function setTableDefinition this gt setTableName user this gt hasColumn id integer 4 array primary gt true autoincrement gt true this gt hasColumn username string 255 this gt hasColumn password string 255 public function setUp this gt hasMany Group as Groups array refClass gt UserGroup local gt user_id foreign gt group id this gt hasMany UserGroup array local gt id foreign gt user_id Add custom methods to system application models User php This class has been auto generated by the Doctrine ORM Framework class User extends BaseUser public f
38. rAddress echo get_class addresses 1 CompanyAddress SENSIOLABS X Chapter 7 Master and Slave Connections 35 Chapter 7 Master and Slave Connections In this tutorial we explain how you can setup Doctrine connections as master and slaves for both reading and writing data This strategy is common when balancing load across database servers So the first thing we need to do is configure all the available connections for Doctrine connections array Listing master gt mysql root master dbname slave 1 gt mysql root slavel dbname slave 2 gt mysql root slave2 dbname Slave 3 gt mysql root slave3 dbname slave 4 gt mysql root slave4 dbname foreach connections as name gt dsn Doctrine Manager connection dsn name Now that we have one master connection and four slaves setup we can override the Doctrine Record and Doctrine Query classes to add our logic for switching between the connections for read and write functionality All writes will go to the master connection and all reads will be randomly distributed across the available slaves Lets start by adding our logic to Doctrine Query by extending it with our own MyQuery class and switching the connection in the preQuery hook class MyQuery extends Doctrine Query Listing 2 Since php doesn t support Late static binding in 5 2 we need to override this method to instantiate a new MyQu
39. rate migrations models doctrine gen migrations from models init admin Initializes a Doctrine admin module doctrine init admin insert sql Inserts SQL for current model doctrine insert sql migrate Migrates database to current specified version doctrine migrate rebuild db Creates database for current model doctrine rebuild db First sfDoctrinePlugin currently requires that at least one application be setup so lets just instantiate a frontend application now php symfony generate app frontend Setup Database Now lets setup our database configuration in config databases yml Open the file in your favorite editor and place the YAML below inside For this test we are simply using a SQLite database Doctrine is able to create the SQLite database at the config doctrine db path for you which we will do once we setup our schema and some data fixtures all doctrine class sfDoctrineDatabase param dsn sqlite Setup Schema Now that we have our database configured lets define our YAML schema files in config doctrine schema yml In this example we are setting up a simple BlogPost model which hasMany Tags BlogPost actAs Sluggable fields title SENSIOLABS gt Chapter 2 symfony and Doctrine 13 Timestampable columns title string 255 body clob author string 255 relations Tags class Tag refClass BlogPostTag foreignAlias BlogPosts BlogPostTag columns blog post i
40. reak if apply alias params alias aliases array aliases alias foreach conditions through as key gt table index 0 found false foreach from as index gt val if strpos val table false found true break if found vals explode substr from index strpos from index table alias count vals 2 vals 1 vals 0 aliases alias else newalias strtolower substr table 0 3 self alias count q gt leftJoin end aliases table newalias aliases newalias wheres end aliases conditions field pars self user id if empty wheres q gt addWhere implode OR wheres pars static public function setUserId id self user id id static public function setCredentials vals self credentials vals SENSIOLABS HY Chapter 9 Record Based Retrieval Security Template 47 YAML schema syntax Here is the schema I used this template with I ve removed lots of extra options other templates I was using indexes and table names It may not work out of the box without the indexes YMMV a Listing Account actAs gsSecurityTemplate conditions Division through Division UserDivision field user_id apply to division manager Branch through Branch UserBranch field user_id
41. rom BlogPost p blogPosts q gt execute foreach blogPosts as blogPost author Doctrine getTable Author gt findOneByName blogPost gt author if author instanceof Author amp amp author gt exists author new Author author gt name blogPost gt author author gt save blogPost gt author_id author gt id blogPost gt save public function up this gt removeColumn blog post author public function down this gt addColumn blog post author string array length gt 255 Now run the following command and Doctrine will automatically perform the migration process and update the database SENSIOLABS gt Chapter 3 symfony and Doctrine Migrations 22 Run Migration Listing symfony doctrine migrate frontend gt gt doctrine migrated successfully to version 2 Now the database is updated with the new schema information and data migrated Give it a check and you will see that we have a new author table the blog post author column is gone and we have a new blog post author id column that is set to the appropriate author id value The 2 migration removed the author column from the blog post table but we left it in the model definition so that while it still existed before the 2 migration began we copied the contents of the author column to the author table and related the blog post to the author id You can no
42. rted You can place the yaml file in schemas schema yml The command line interface looks for all yml files in the schemas folder rents Listing User di columns id primary true autoincrement true type integer 4 username string 255 password string 255 relations Groups class Group refClass UserGroup SENSIOLABS gt Listing 1 4 Listing 1 5 Chapter 1 My First Project 6 foreignAlias Users Group tableName groups columns id primary true autoincrement true type integer 4 name string 255 UserGroup columns user id integer 4 group id integer 4 relations User onDelete CASCADE Group onDelete CASCADE Test Data Fixtures Below is a sample yaml data fixtures file You can place this file in data fixtures data yml The command line interface looks for all yml files in the data fixtures folder User zyne username zYne password changeme Groups founder lead documentation jwage username jwage password changeme Groups lead documentation Group founder name Founder lead name Lead documentation name Documentation Building Everything Now that you have written your schema files and data fixtures you can now build everything and begin working with your models Run the command below and your models will be generated in the models folder doctrine build all reload build all reload Are you sure you wish to drop your databases y n y
43. s gt setTableName user this gt hasColumn username string 255 array type gt string length gt 255 this gt hasColumn password string 255 array type gt string length gt 255 The save method will happen on the master connection because it is a write user new User user gt username jwage user gt password changeme user gt save This query goes to one of the slaves because it is a read q new MyQuery q gt from User u users q gt execute print_r users gt toArray true SENSIOLABS X Chapter 7 Master and Slave Connections 37 This query goes to the master connection because it is a write q new MyQuery q gt delete User gt from User u gt execute SENSIOLABS X Listing 8 1 Listing 8 2 Listing 8 3 Chapter 8 Creating a Unit of Work Using Doctrine 38 Chapter 8 Creating a Unit of Work Using Doctrine Writing a Unit of Work in PHP Doctrine By Jon Lebensold http jon lebensold ca se In this tutorial we re going to create a Unit Of Work object that will simplify performing transactions with Doctrine Models The Goal here is to centralize all of our commits to the database into one class which will perform them transactionally Afterwards we can extend this class to include logging and error handling in case a commit fails It is helpful to think of the Unit of Work a
44. s a way of putting everything that we would want to update insert and delete into one bag before sending it to the database Let s create a Doctrine YAML file with a Project Model Project tableName lookup project columns id primary true autoincrement true type integer 4 name string 255 With Doctrine models saving a Project should be as simple as this project new Project project gt name new project project gt save However as soon as we want to perform database transactions or logging becomes a requirement having save statements all over the place can create a lot of duplication To start with let s create a UnitOfWork class class UnitOfWork 1 protected createOrUpdateCollection array protected deleteCollection array 16 http jon lebensold ca SENSIOLABS YY Chapter 8 Creating a Unit of Work Using Doctrine 39 Because Doctrine is clever enough to know when to UPDATE and when to INSERT we can combine those two operations in one collection We ll store all the delete s that we re planning to form in deleteCollection Now we need to add some code to our class to make sure the same object isn t added twice protected function existsInCollections model Listing i i does the model already belong to the createOrUpdate collection foreach this gt createOrUpdateCollection as m if model gt getOid m gt getOid return true does th
45. se and load data doctrine build all load build all reload Generates Doctrine model SQL initializes database and load data doctrine build all reload build all reload test all Generates Doctrine model SQL initializes database load data and run all test suites doctrine build all reload test all build db Creates database for current model doctrine build db build forms Creates form classes for the current model doctrine build forms build model Creates classes for the current model doctrine build model build schema Creates a schema xml from an existing database doctrine build schema build sql Creates SQL for the current model doctrine build sql data dump Dumps data to the fixtures directory doctrine dump data data load Loads data from fixtures directory SENSIOLABS X Listing 2 3 Listing 2 4 Listing 2 5 Chapter 2 symfony and Doctrine 12 doctrine load data dql Execute a DQL query and view the results doctrine dql drop db Drops database for current model doctrine drop db generate crud Generates a Doctrine CRUD module doctrine generate crud generate migration Generate migration class doctrine generate migration generate migrations db Generate migration classes from existing database connections doctrine generate migrations db doctrine gen migrations from db generate migrations models Generate migration classes from an existing set of models doctrine gene
46. t column are automatically set onInsert and onUpdate and the slug column is a url friendly string that is created from the value of the name column Doctrine has a few behaviors that are included in core such as Sluggable and Timestampable but the behavior system is built to allow anyone to easily write behaviors for their models to re use over and over Admin Generators Now we have our data model all setup and populated with some test fixtures so lets generate an admin generator to manage the blog posts and tags php symfony doctrine init admin frontend blog posts BlogPost php symfony doctrine init admin frontend tags Tag Now go open up your web browser and check out the frontend application and the blog posts and tags modules It should be located at a url like the following SENSIOLABS X Chapter 2 symfony and Doctrine 15 http localhost symfony1 1Doctrine web frontend dev php blog posts Listing http localhost symfony1 1Doctrine web frontend_dev php tags i Now with a little configuration of the blog post admin generator we can control the associated blog post tags by checking checkboxes when editing a blog post Open apps frontend modules blog posts config generator yml and replace the contents with the YAML from below as Listing 2 11 generator class sfDoctrineAdminGenerator param model_class BlogPost theme default list display title author object actions _e
47. t Array id gt 3 name gt Documentation SENSIOLABS X Chapter 1 My First Project 8 1 gt Array id gt 2 username gt jwage password gt changeme Groups gt Array 0 gt Array id gt 2 name gt Lead 1 gt Array id gt 3 name gt Documentation You can also issue DQL queries directly to your database by using the dql command line function It is used like the following Listing jwage sandbox jwage doctrine dql FROM User u u Groups g dql executing FROM User u u Groups g dql dql id 1 dql username zYne dql password changeme dql Groups dql dql id 1 dql name Founder dql dql id 2 dql name Lead dql dql id 3 dql name Documentation dql dql id 2 dql username jwage dql password changeme dql Groups dql dql id 2 SENSIOLABS X Chapter 1 My First Project 9 dql name Lead dql dql id 3 dql name Documentation User CRUD Now we can demonstrate how to implement Doctrine in to a super simple module for managing users and passwords Place the following code in your index php and pull it up in your browser You will see the simple application require once config php Listing Doctrine LoadModels models module isset REQUEST module REQUEST module users action isset REQUEST action
48. t http jon lebensold ca or mail me at jon lebensold ca if you have any questions 17 http jon lebensold ca SENSIOLABS gt Chapter 9 Record Based Retrieval Security Template 44 Chapter 9 Record Based Retrieval Security Template Introduction This is a tutorial amp how to on using a security template and listener to restrict a user to specific records or a range of specific records based on credentials and a user table association Basically fine grained user access control This template was created for a project which had a few credentials division manager district manager branch manager and salesperson We have a list of accounts their related sales and all sorts of sensitive information for each account Each logged in user should be allowed to only view the accounts and related information based off their credentials either the division district branch or salesperson they are allowed to view So a division manager can view all info for all accounts within his division A salesperson can only view the accounts they are assign The template has been a work in progress so the code below may not actually be the final code I m using today But since it is now working for all situations I m asking of it I thought 1 would post it as is Template Listing class gsSecurityTemplate extends Doctrine Template protected _options array construct x param string options return void public fu
49. unction setPassword password this gt password md5 password This class has been auto generated by the Doctrine ORM Framework my class UserTable extends Doctrine Table public function retrieveALl query new Doctrine Query query gt from User u query gt orderby u username ASC return query gt execute SENSIOLABS X Chapter 4 Code Igniter and Doctrine 29 Now we can create some sample data to load in to our application this step requires you have a valid database configured and ready to go The build all reload task will drop and recreate the database create tables and load data fixtures Create a file in system application fixtures users yml vi fixtures users yml Listing Add the following yaml to the file Listing User a jwage username jwage password test Now run the build all reload task to drop db build models recreate doctrine build all reload er build all reload Are you sure you wish to drop your databases y n i y build all reload Successfully dropped database named jwage codeigniter build all reload Generated models successfully from YAML schema build all reload Successfully created database named jwage codeigniter build all reload Created tables successfully build all reload Data was successfully loaded Now we are ready to use Doctrine in our actual actions Lets open our system application views welcome message php and somewhere
50. w remove the author string 255 column definition from the config doctrine schema yml and rebuild the models Here is the new BlogPost model definition Listing 2 BlogPost actAs Sluggable fields title columns title string 255 body clob author_id integer relations Author foreignAlias BlogPosts Tags class Tag refClass BlogPostTag foreignAlias BlogPosts Re build the models now since we removed the author column from the model definition and the table in the database Listing symfony doctrine build model gt gt doctrine Generated models successfully Now lets run a DQL query from the command line to see the final product Listing symfony doctrine dql frontend FROM BlogPost p p Tags p Author a gt gt doctrine executing FROM BlogPost p p Tags p Author a gt gt doctrine gt gt doctrine id 1 gt gt doctrine title symfony Doctrine gt gt doctrine body symfony and Doctrine are great gt gt doctrine author id 1 gt gt doctrine slug symfony doctrine gt gt doctrine Tags gt gt doctrine gt gt doctrine id 1 gt gt doctrine name symfony gt gt doctrine SENSIOLABS X Chapter 3 symfony and Doctrine Migrations gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt doctrine doctrine doctrine doctrine doctrine doctrine doctrine doctrine id 2 name doctrine id 3 name php Author id 1 name
51. ymfony doctrine generate migration frontend MigrateAuthor gt gt doctrine Generated migration class Migr Doctrine lib migration doctrine Now we have 2 blank migration skeletons to write our migration code in Below I have provided the code to migrate the author column to an Author model and automatically relate blog posts to the newly created author id 001 add author class php pes This class has been auto generated by the Doctrine ORM Framework class AddAuthor extends Doctrine_Migration public function up Create new author table columns array id gt array type gt integer length gt 4 autoincrement gt true name gt array type gt string length gt 255 this gt createTable author columns array primary gt array id SENSIOLABS X Chapter 3 symfony and Doctrine Migrations 21 Add author id to the blog post table this gt addColumn blog post author id integer array length gt 4 public function down Remove author table this gt dropTable author Remove author_id column from blog post table this gt removeColumn blog post author id 002 migrate author class php This class has been auto generated by the Doctrine ORM Framework e class MigrateAuthor extends Doctrine Migration public function preUp 1 q Doctrine Query create gt select p id p author gt f
Download Pdf Manuals
Related Search
Related Contents
LG 24MB35D-B 第3回議事録 - 経済産業省 Samsung WB5500 دليل المستخدم Owner`s Manual AJA Ki Pro Quad Manual 取扱説明書 - 中部コーポレーション Rust-Oleum Specialty 257465 Use and Care Manual ラムダチェーン BS/DIN規格 リニューアル Installation/User Manual Nokia 2610 Cell Phone User Manual Copyright © All rights reserved.
Failed to retrieve file