Pereiti prie turinio

Patarkit dėl OOP PHP


Rekomenduojami pranešimai

O jei prireiks panaudoti subselectus, join'us, datos formavimo funkcijas ir t.t ?

 

Niekad OOP tokiose situacijose nenaudojau, tai ir pačiam įdomu daros :)

Joinais tau rūpintis nereikia, nes tu apibrėždamas entity klasę(atitinka duombazės lentelę), apibrėši ir šąryšius.

 

 

Subselectų reikėtų vengti, bet jei reikia, galima naudoti query builderį. Geras pavyzdys SO.

 

o dėl datos formavimo funkcijos nelabai supratau, kas tau įdomu ;)

 

Pavyzdžiui :

 


<?php

use Doctrine\ORM\Mapping;

/**
* AuthProviderUser
*
* @Doctrine\ORM\Mapping\Table(name="auth_provider_user")
* @Doctrine\ORM\Mapping\Entity
*/
class Default_Model_AuthProviderUser
{
   /**
	* @var integer $id
	*
	* @Doctrine\ORM\Mapping\Column(name="id", type="integer", nullable=false)
	* @Doctrine\ORM\Mapping\Id
	* @Doctrine\ORM\Mapping\GeneratedValue(strategy="IDENTITY")
	*/
   private $id;

   /**
	* @var integer $providerId
	*
	* @Doctrine\ORM\Mapping\Column(name="provider_id", type="integer", nullable=false)
	*/
   private $providerId;

   /**
	* @var string $identifier
	*
	* @Doctrine\ORM\Mapping\Column(name="identifier", type="string", length=11, nullable=false)
	*/
   private $identifier;

   /**
	* @var boolean $isEnabled
	*
	* @Doctrine\ORM\Mapping\Column(name="is_enabled", type="boolean", nullable=false)
	*/
   private $isEnabled;

   /**
	* @var datetime $rowVersion
	*
	* @Doctrine\ORM\Mapping\Column(name="_row_version", type="datetime", nullable=false)
	*/
   private $rowVersion;

   /**
	* @var User
	*
	* @Doctrine\ORM\Mapping\ManyToOne(targetEntity="Default_Model_User")
	* @Doctrine\ORM\Mapping\JoinColumns({
	*   @Doctrine\ORM\Mapping\JoinColumn(name="user_id", referencedColumnName="id")
	* })
	*/
   private $user;

public function __get($property) {
       if (property_exists($this, $property)) {
           return $this->$property;
       }
   }

   public function __set($property, $value) {
       if (property_exists($this, $property)) {
           $this->$property = $value;
       }
   }
}

 

Kaip matai $user yra joininamas. :)

 

 

Entity panaudojimas:

 

$provider_auth_user = $this->_em->getRepository('Default_Model_AuthProviderUser')
               ->findOneByIdentifier($identifier);

//panaudojimas

echo $provider_auth_user->User->email;

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Mačiau kažkas čia pavyzdžiuose vykdė užklausas cikle. Ar tai greičio atžvilgiu gera praktika? Jei viena užklausa vyksta 0.005s, kiek laiko vyktų, jei būtų 1000 įrašų? 5 sekundes, o jei 10k įrašų? 50s, o tiksliau tokiu atveju įvyktų timeout...

Cikle vykdyti užklausas tikrai neefektivu.Beje, kokias užklausas cikle turi omenyje? Įterpimo? Jei taip, įterpimui naudojamos Doctrine Collections, kurios optimizuoja įterpimą. Pvz 2000 įrašų įrašo per 1 sekundę, jei neklystus :)Na ir pavyzdukas :

 

 

 


$relates_collection = new Doctrine_Collection('Products_Model_ProductBookRelation');

       foreach ($relations as $item)  {
           $record = new Products_Model_ProductBookRelation;
           $record->set('product_id', $item['product_id']);
           $record->set('book_id', $item['book_id']);
           $record->set('price', (float)$item['price']);
           $record->set('vat', $item['vat']);
           $relates_collection->add($record);
       }
       $relates_collection->save();

O dideliems duomenų kiekiams apdoroti naudojami chunks

Redagavo karolisgud
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jus cia zmones is tuscio i kiaura... Kaip sake vienoje JS prezentacijoje: Viena is dabartiniu programuotoju problemu yra tai, kad jie pradeda optimizuoti koda dar jo net neprarasius. Refaktoringa reikia taikyti tik parasius koda, o ne pries. O kas liecia greituma, tai OOP yra tik gyvenimo stilius. Nera tokio dalyko, kurio negalima butu padaryti tik proceduriskai, ar tik su OOP. Ir be to b OOP dar visokiu yra, pvz AOP. Tad kaip jau minejau - is tuscio i kiaura.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tau reikia ne OOP, o normalaus frameworko ar bent ORM. Nes dabar net ir funkcijas rašai pakankamai beprasmiškai, kai didžioji dalis to būtų padaryta iš tave. Struktūros (kad ir MVC kokio), kiek pamenu iš tavo ankstesnių pavyzdžių, taip pat nerasta.

 

Nesuprasdamas OOP, bet bandydamas juo rašyt, vis tiek nesukursi, nesu-dizaininsi (:D) visko normaliai.

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...