<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Object Relational Mapping | Nerdpress.org</title>
	<atom:link href="https://nerdpress.org/tag/object-relational-mapping/feed/" rel="self" type="application/rss+xml" />
	<link>https://nerdpress.org</link>
	<description>...dev, tech problems and solutions.</description>
	<lastBuildDate>Tue, 30 Mar 2021 06:00:21 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Silverstripe Complex Fields</title>
		<link>https://nerdpress.org/2009/09/13/silverstripe-complex-fields/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 13 Sep 2009 20:41:45 +0000</pubDate>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Silverstripe]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[DataObject]]></category>
		<category><![CDATA[DBField]]></category>
		<category><![CDATA[Object Relational Mapping]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=240</guid>

					<description><![CDATA[<p>Silverstripe ist ja ein Superding. Problematisch nur hin und wieder, dass die Dokumentation nicht allzuviel hergibt und das Ding intern teils etwas eigenwillig geschrieben ist. So ist der ORMapper eher für Routineaufgaben geeignet, komplexere Anforderungen erfüllt man besser &#8220;zu Fuß&#8221;. Und die DBFields &#8230; tjaja. Nirgends (?) steht geschrieben, wie man denn die magisch überladenen &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2009/09/13/silverstripe-complex-fields/" class="more-link">Continue reading<span class="screen-reader-text"> "Silverstripe Complex Fields"</span></a></p>
The post <a href="https://nerdpress.org/2009/09/13/silverstripe-complex-fields/">Silverstripe Complex Fields</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p><a href="http://silverstripe.org/">Silverstripe</a> ist ja ein Superding. Problematisch nur hin und wieder, dass die <a href="https://docs.silverstripe.org/">Dokumentation</a> nicht allzuviel hergibt und das Ding intern teils etwas eigenwillig geschrieben ist. So ist der <a href="http://de.wikipedia.org/wiki/Object-Relational_Mapping">ORMapper</a> eher für Routineaufgaben geeignet, komplexere Anforderungen erfüllt man besser &#8220;zu Fuß&#8221;.</p>
<p>Und die <a href="http://api.silverstripe.com/sapphire/core/DBField.html">DBFields</a> &#8230; tjaja. Nirgends (?) steht geschrieben, wie man denn die magisch überladenen Getter und Setter dazu bringt, hier den primitiven Typ, dort die Objektrepräsentation zu liefern. Gesetzt den Fall, man hat ein Feld &#8220;Price&#8221; vom Typ &#8220;Currency&#8221;:</p>
<p><span id="more-240"></span></p>
<pre class="brush: php; title: ; notranslate">

$myObject-&amp;gt;Price; // liefert Float.
$myObject-&amp;gt;dbObject('Price'); // liefert Currency

</pre>
<p>Der direkte Zugriff auf die Eigenschaft (intern aber magisch via __get() auf die entsprechenden Attribute gemappt) liefert also den &#8220;Rohwert&#8221;, die Methode dbObject(&#8216;FieldName&#8217;) die komplexe Objektrepräsentation.</p>
<p>Manchmal möchte man diese Werte im eigenen Controller auch mal setzen:</p>
<pre class="brush: php; title: ; notranslate">

$myObject-&amp;gt;Price = 9999.9932; // float gesetzt
echo $myObject-&amp;gt;dbObject('Price')-&amp;gt;Nice() // string, &amp;quot;$ 9,999.90&amp;quot;

$myObject-&amp;gt;Price = 124553412312512514214521412414..... // Eine wirklich lange Zahl, die mit ziemlicher Sicherheit überläuft.
echo $myObject-&amp;gt;Price // 1.24553412313E+35, was zu erwarten war

$myObject-&amp;gt;Price = &amp;quot;12455341231251251421452......&amp;quot; // Eine wirklich lange Zahl, die mit ziemlicher Sicherheit überläuft.

echo $myObject-&amp;gt;Price
// (string) 124553412312512514214521412414551324.123152134
// 152141231212536324123132, aber wie sieht es in der Datenbank aus?

$myObject-&amp;gt;dbObject('Price')
// Peng! €124,553,412,312,512,528,384,343,341,833,125,888.00

</pre>
<p>Man nutzt also ausschließlich den direkten Zugriff auf Instanzeigenschaften (intern auch wieder gemappt  via magic __set()), um komplexe Werte zu setzen. Nebenbei haben wir auch bemerkt, dass das Ganze nicht wirklich sicher im Umgang mit Zahlen ist. Man ist also selbst gegenüber der Datenbank in der Verantwortung, die Felder ggf. durch PHP-Funktionen, die <a href="http://us3.php.net/manual/en/book.bc.php">Präzision</a> außerhalb der Grenzen &#8220;normaler&#8221; Fließkommaberechnungen erlauben, zu schützen.</p>
<p>Manchmal möchte ich die Vorteile eines DBField-Objekts auch mal außerhalb des Datenbankkontextes benutzen. Ein simples Beispiel sind Ergebnisse von Berechnungen im Warenkorb, die ich im Template ebenfalls wie &#8220;normale&#8221; DBFields via Nice()-Methode formatieren möchte.</p>
<p>Vorstellbar ist eine (vereinfachte) Methode getTotalPrice():</p>
<pre class="brush: php; title: ; notranslate">

class Cart_Controller extends Page_Controller
{
public function getTotalPrice()
{
$total = 0;
foreach($this-&amp;gt;getItems() AS $item)
{
$total += $item-&amp;gt;Price();
}
return $total;
}
}

</pre>
<p>Um den Weg über</p>
<pre class="brush: php; title: ; notranslate">

$v = new myDBField('NameDenDasFeldNichtBraucht');
$v-&amp;gt;setValue();
return $v;

</pre>
<p>abzukürzen, bietet DbField eine statische Methode create():</p>
<pre class="brush: php; title: ; notranslate">

public function getTotalPrice()
{
$total = 0;
foreach($this-&amp;gt;getItems() AS $item)
{
$total += $item-&amp;gt;Price();
}
return DbField::create('Currency',  $total);
}

</pre>
<p>Dann kann man im <a href="https://web.archive.org/web/20100417152210/http://doc.silverstripe.org:80/doku.php?id=templates">Template</a> schreiben:</p>
<pre class="brush: jscript; title: ; notranslate">

&amp;lt;p&amp;gt;Preis: $getTotalPrice.Nice&amp;lt;/p&amp;gt;

</pre>
<p>An dieser Stelle ist aber Vorsicht geboten, denn</p>
<pre class="brush: php; title: ; notranslate">

$myDataObject-&amp;gt;Price = new DbField('Currency', 13.421);

</pre>
<p>Wird natürlich nicht funktionieren (siehe auch weiter oben, Setter sind ausschließlich die via __set() erreichbaren Attribute eines DbFields). Ganz im Gegenteil, hier wird sogar eine Warnung via Exception geworfen, weil jedes DbField nach Instanziierung  bereits benamt ist und eine (magische) Neu-Zuordnung zu einem bereits existierendem <a href="http://doc.silverstripe.org/doku.php?id=dataobject">DataObject</a> eine neue Benamung voraussetzt. Das impliziert, dass DbField-Instanzen ausschließlich via</p>
<pre class="brush: php; title: ; notranslate">

$myDataObject-&amp;gt;dbObject('FieldName');

</pre>
<p>erreicht werden können.</p>
<p>Möchte man auf den internen Wert eines DbFields zurückgreifen, nutzt man einfach die Methode RAW() oder auch einfach die Methode forTemplate() (die jedes Objekt, das ViewableData implementiert, besitzt), die in diesem Falle einfach ein Proxy auf RAW() ist.</p>The post <a href="https://nerdpress.org/2009/09/13/silverstripe-complex-fields/">Silverstripe Complex Fields</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
