Blame | Letzte Änderung | Log anzeigen | RSS feed
<com:TContent ID="body"><h1>Inheritance Mapping</h1><p>The SQLMap PHP DataMapper supports the implementationof object-oriented inheritance (subclassing) in your object model. There areseveral developer options for mapping entity classes and subclasses todatabase results:</p><p>You can use the mostefficient mapping strategies from a SQL and query performance perspective whenusing the inheritance mappings of the DataMapper. To implement an inheritancemapping, the <tt>resultMap</tt> must define one or more columns in your query'sresultset that will serve to identify which <tt>resultMap</tt> should be used to mapeach result record to a specific subclass. In many cases, you will use onecolumn value for the DataMapper to use in identifying the proper resultMap andsubclass. This column is known as a discriminator.</p><p>For example, we have a table defined in a database that contains <tt>Document</tt>records. There are five table columns used to store Document IDs, Titles,Types, PageNumbers, and Cities. Perhaps this table belongs to a legacydatabase, and we need to create an application using this table with a domainmodel that defines a class hierarchy of different types of Documents. Orperhaps we are creating a new application and database and just want topersist the data found in a set of related classes into one table. In eithercase, the DataMapper's inheritance mapping feature can help.</p><com:TTextHighlighter Language="sql" CssClass="source">CREATE TABLE Documents (Document_ID int NOT NULL ,Document_Title varchar(32) NULL ,Document_Type varchar(32) NULL ,Document_PageNumber int NULL ,Document_City varchar(32) NULL)</com:TTextHighlighter><p>To illustrate this, let's take a look at a few example classes shown belowthat have a relationship through inheritance and whose properties can bepersisted into our Documents table. First, we have a base Document class thathas Id and Title properties. Next, we have a Book class that inherits fromDocument and contains an additional property called PageNumber. Last, we havea Newspaper class that also inherits from Document and contains a Cityproperty.</p><com:TTextHighlighter Language="php" CssClass="source">class Document{public $ID = -1;public $Title = '';}class Book extends Document{public $PageNumber = -1;}class Newspaper extends Document{public $City = '';}</com:TTextHighlighter><p>Now that we have our classes and database table, we can start working on ourmappings. We can create one <tt><select></tt> statement that returns all columns in thetable. To help the DataMapper discriminate between the different Documentrecords, we're going to indicate that the <tt>Document_Type</tt> column holds valuesthat will distinguish one record from another for mapping the results into ourclass hierarchy.</p><com:TTextHighlighter Language="xml" CssClass="source"><select id="GetAllDocument" resultMap="document">selectDocument_Id, Document_Title, Document_Type,Document_PageNumber, Document_Cityfrom Documentsorder by Document_Type, Document_Id</select><resultMap id="document" class="Document"><result property="Id" column="Document_ID"/><result property="Title" column="Document_Title"/><discriminator column="Document_Type" type="string"/><subMap value="Book" resultMapping="book"/><subMap value="Newspaper" resultMapping="newspaper"/></resultMap><resultMap id="book" class="Book" extends="document"><property="PageNumber" column="Document_PageNumber"/></resultMap><resultMap id="newspaper" class="Newspaper" extends="document"><property="City" column="Document_City"/></resultMap></com:TTextHighlighter><p>The DataMapper compares the data found in the discriminator column to thedifferent <tt><submap></tt> values using the column value's string equivalence. Basedon this string value, SQLMap DataMapper will use the resultMap named "<tt>Book</tt>" or"<tt>Newspaper</tt>" as defined in the <tt><submap></tt> elements or it will use the"parent" resultMap "<tt>Document</tt>" if neither of the submap values satisfy the comparison.With these resultMaps, we can implement an object-oriented inheritance mappingto our database table.</p><p>If you want to use custom logic, you can use the typeHandler attribute of the<tt><discriminator></tt> element to specify a custom type handler for the discriminatorcolumn.</p><com:TTextHighlighter Language="xml" CssClass="source"><resultMap id="document-custom-formula" class="Document"><result property="Id" column="Document_ID"/><result property="Title" column="Document_Title"/><discriminator column="Document_Type" typeHandler="CustomInheritance"/><subMap value="Book" resultMapping="book"/><subMap value="Newspaper" resultMapping="newspaper"/></resultMap></resultMaps></com:TTextHighlighter><p>The value of the <tt>typeHandler</tt> attribute specifies which of our classesimplements the <tt>ITypeHandlerCallback</tt> interface. This interface furnishes a<tt>getResult</tt> method for coding custom logic to read the column result value andreturn a value for the DataMapper to use in its comparison to the resultMap'sdefined <tt><submap></tt> values.</p><com:TTextHighlighter Language="php" CssClass="source">class CustomInheritance implements ITypeHandlerCallback{public function getResult($type){if ($type=="Monograph" || $type=="Book")return "Book";else if ($type=="Tabloid" || $type=="Broadsheet" || $type=="Newspaper")return "Newspaper";elsereturn "Document";}public function getParameter($object){throw new Exception('unimplemented');}public function createNewInstance(){throw new Exception('unimplemented');}}</com:TTextHighlighter></com:TContent>