Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web development, networking and server security. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

DBIx::Class

Hteo sam da zastanem za trenutak i da pojasnim zakrpu koju sam podneo nedavno kako bi mi pomogla u radu na kalendaru. Zakrpa dodaje mogućnost Koha-i da koristi DBIX::Class. Usmeriću ovaj post ka Koha developerima tako da ne moraju da se muče kao što sam ja kako bi moj kod proradio.

Osnovni

Prvo treba da znamo kako da učitamo objekat klase. Relativno je slično pokretanju DBI identifikatoru objekta.

my $schema = C4::Context->schema;

Nakon što dobijete vaš novi šema objekat morate malo da radnite na njemu. Za jednostavne upite možete prosto izvršiti pretrage na osnovu ID:

my $resultset = $schema->resultset("ClassName")->find($id);

Postoji nekoliko stvari u tekstu iznad koje treba da pojasnim. Prvo, ClassName je uvek oblik u jednini vaše tabele baze podataka. Ukoliko morate da proverite i potvrdite pogledajte u /Koha/Schema/ResultSet/ClassName.pm. Drugo, pretraživanje će vratiti ResultSet objekat. Možete pronaći načine da manipulišete ResultSet podacima ovde.

Napredni

Za naprednije upite možete koristiti sintaksu pretraživanja.

my $resultset = $schema->resultset("ClassName")->search({
column_one => $var1,
column_two => $var2,
});

Ovo će pokrenuti upit:

Select * from ClassName where column_one = ? and column_two = ?

Gde će znaci ? biti zamenjeni vašim promenljivim.

Sada recimo da morate da obavite kompleksniju pretragu. Možda treba da upotrebite OR (ILI) ili kombinaciju OR (ILI) i AND (I). Dovoljno prosto:

my $resultset = $schema->resultset("ClassName")->search({
-and => [
-or => [
column_one => $var1,
column_two => $var2,
],
-between => [
timestamp1 => $time,
timestamp2 => $now,
],
column_three => $var3,
]
});

Kao što možete videti, upiti mogu biti onoliko složeni koliko biste vi to želeli. Sve opcije koje su dostupne u vašem RDBMS, dostupne su vam u DBIx::Class.

Pristupite ili Unapred učitajte

Siguran sam da ste prilično upoznati sa pristupima sa vašeg RDMBS ali ako ste imalo nalik meni, učitavanje unapred je veoma novo. Spojna sintaksa i sintaksa za učitavanje unapred su u osnovi iste i zahtevaju ista podešavanja za dovršetak.

Pre izvršavanja spoja morate definisati na šta da se spojite u Class datoteci za vašu tabelu. Napominjem da je sve ove datoteke klase pokrenuo DBIx::Class::Schema:Loader i uključene su u moju zakrpu. Ukoliko biste đželeli da dodate operaciju spajanja pogledajte u dno datoteke posle MD heša i dodajte:

__PACKAGE__->has_many( somethings => 'Koha::Schama::Result::ClassName'
, 'something_id');

Ovo će dodati jedan odnos mnogim odnosima koje možete koristiti u svojim upitima. Vidite primer ispod za operaciju spajanja.

Odabrana sintaksa sa spojem izgleda nešto poput ovog:

my $resultset = $schema->resultset("ClassName")->search({
column_one => $var1,
column_two => $var2,
},
{join => "somethings"},
);

Imajte na umu da možete definisati bilo kakvu vrstu spoja koja je dostupna u vašem RDBMS preko vaše datoteke klase. Možete takođe praviti gnezdo spojeve i bilo kakve druge blesave operacije. Za više primera pogledajte Kuvar.

Pred-preuzimanje je vrlo zanimljivo po tome što radi istu stvar kao i spoj OSIM kada želite da upotrebite taj podatak ponovo ono ne proziva bazu podataka za sveže informacije. Umesto toga koristi podatke iz prvog upita koji bi mogao da ima potencijal da znatno ubrza učitavanje strana. Da biste koristili pred-preuzimanje samo zamenite “join” sa “prefetch”.

InflateColumn

Postoji nekoliko stvari koje čine DBIx::Class moćnom alatkom u vašem arsenalu ali nagomilavanje podataka je jedna od mojih omiljenih. Na primer, imamo kolonu DatumVreme u našoj bazi podataka i želimo da je koristimo kao Perl Datum Vreme objekat u našem kodu. Umesto da koristimo DateTime::Formatter::MySQL ili nešto slično, možemo koristiti InflateColumn::DateTime. Na ovaj način nam DBIx::Class ne vraća DatumVreme niz već DatumVreme objekat koji je spreman za upotrebu.

Takođe možete koristiti InflateColumn za ostale vrste objekata ili možete pisati svoje sopstvene programe (inflatore) za nagomilavanje podataka.

Nove mogućnosti sa DBIx::Class

DBIx::Class otvara čitav novi svet mogućnosti za Koha-u da ih koristi za svakodnevne operacije. Neke od njih obuhvataju:

  • DBIx::Class::DeploymentHandler – Version Control
  • DBIx::Class::InflateColumn – Object Inflation
  • DBIx::Class – upravljanje podacima iz višestrukih baza podataka
  • mnogo toga što nisam uspeo da istražim još uvek

ako imate bilo kakvih pitanja u vezi DBIx::Class i kako ga koristiti u Koha slobodno me pronađite na IRC kao libsysguy, pošaljite mi e-mail, ili ostavite komentar ispod.

Reference

  • http://search.cpan.org/~frew/DBIx-Class-0.08201/lib/DBIx/Class/Manual/Cookbook.pod
  • http://search.cpan.org/~mstrout/DBIx-Class/lib/DBIx/Class/Manual/Cookbook.pod
  • http://search.cpan.org/~mstrout/DBIx-Class-0.08202/lib/DBIx/Class/InflateColumn.pm
  • http://search.cpan.org/~frew/DBIx-Class-DeploymentHandler-0.002202/lib/DBIx/Class/DeploymentHandler.pm




Published (Last edited): 23-06-2013 , source: http://bywatersolutions.com/2012/10/10/dbixclass/