Jump to content
php.lv forumi

mysql dalisana - CI


goma smile

Recommended Posts

  • Replies 60
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

That's still awful. Kāpēc gan nechainot callus un vispār kāpēc neveidot kaut kādu query objektu, kurš jau satur konkrētas where/having/group/limit/join etc. metodes tā vietā, lai taisītu šos callus uz pamata db objektu? Tā ir God klase, not good IMHO.

Man, piemēram, ir uztaisīts sekojoši:

DbHandler klase satur metodes "select()", "insert()", "update()", "deleteFrom()", kuras, attiecīgi, padod "DbSelect", "DbInsert", "DbUpdate" un "DbDelete" objektus, kuri jau tālāk satur konkrēti metodes darbībām, saistītām tieši ar to query tipu, kā arī kapsulē esošo query. Objektu var "echo $obj;" un izdrukās tajā esošo query. DbHandler pats satur tikai pamata connection darbības (connect, startTransaction/commit/rollback/getLastInsertId/quote/execute(plain sql w/ no rset)).

Attiecīgi parasts SELECT izskatās šādi:

$rset = DbHandler::getInstance()
    ->select(array('colA', 'colB'), 'table')
    ->where('colC > ?')
    ->limit(10)
    ->fetchAll(array('colCValue'));

Nav perfekti, jo ir daudzas lietas, ko šāds piegājiens ierobežo, bet pagaidām vēl nav bijušas būtiskas problēmas, vienmēr varu izsaukt arī konkrētā query objekta getStatement() metodi, kura atgriež PDOStatement, un tālāk jau rakstīt pliku SQL query, bet līdz tikai varbūt 2x ir bijusi nepieciešamība ko tādu darīt.

 

 

Edit: vispār tajā ellislab lapā ir gandrīz pašā apakšā rakstīts, ka method chaining ir atbalstīts (tikai PHP 5+, bet nedomāju, ka tā būtu kāda problēma). Tipa "$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);"

Edited by jurchiks
Link to comment
Share on other sites

 

Tas, ko CI šeit sauc par Active Record, nav Active Record pat ne tuvu.

Active Record ir pavisam kaut kas cits:

https://en.wikipedia.org/wiki/Active_record_pattern

The interface of an object conforming to this pattern would include functions such as Insert, Update, and Delete, plus properties that correspond more or less directly to the columns in the underlying database table.

 

 

Un izmantošana izskatītos aptuveni šādi:

$user=new User();
$user->loadByID(5);
$user["name"]="john"
$user->update();
Link to comment
Share on other sites

Būtu jau labi, bet ko tad, ja vajag sarakstu ar jūzeru datiem? Pieņemsim, pēdējie 100 reģistrējušies? Visiem objektus taisīt?

Nav jau run par to, runa ir par to, ka tas nav Active Record un tā čeinošana ir diezgan tizla - būtībā tā ir vēlviena abstrakcijas slāņa iespraušana pa vidu vietā, kur tā galīgi nedod nekādu labumu.

 

Bet PHP es darīju tā:

$users = DB::query("SELECT * FROM users ORDER BY registered DESC LIMIT %s", 100)->rows();

un $users būtu 2D masīvs, kur $users[5]['name'] būtu 6. usera no atlasitajiem vārds.

 

Scalā es daru šadi:

SQL("SELECT * FROM users ORDER BY registered DESC LIMIT ?",100).select().as[User]

Un šada izteiksme man atgriež List[user] - listu ar User objektiem. Atškībā no PHP, Scalā nav praktiski nekādas performaces trūkumu, izveidot listu no objetkiem, kamēr PHP tas ir nepiedodami lēni.

Edited by codez
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

Loading...

×
×
  • Create New...