Book-Chinese-MasterPerlToday
view release on metacpan or search on metacpan
lib/Book/Chinese/MasterPerlToday/DBIx-Class.pod view on Meta::CPAN
Row ç»ä»¶ L<DBIx::Class::Row> æ¯å¿
é¡»çç»ä»¶ãå®ä¸º L<DBIx::Class::ResultSourceProxy> é add_columns æä¾ register_column çï¼å¹¶ä¸å½ä½ è°ç¨ search->first, find, all æå¾å°çå°±æ¯åºäºè¯¥ç»ä»¶çå®ä¾ã
è ResultSourceProxy::Table ç»ä»¶ L<DBIx::Class::ResultSource::Table> 乿¯å¿
é¡»çç»ä»¶ã该ç»ä»¶æä¾äº __PACKAGE__->table("error"), ï¼ç±å®çç¶ç±» L<DBIx::Class::ResultSourceProxy> æä¾ï¼ ->add_columns, ->set_primary_key çåè½ã...
å½å¯¹æ§è½è¦æ±æ¯è¾é«çæ¶åï¼æä»¬å¯ä»¥æ¿æ¢ Core 为æå 个ç»ä»¶ï¼å¦æåºéåå åå»ãå½ä½ æ¥æä¸ä¸ªå®æ´çæµè¯éçæ¶åï¼å¢å ååå°å°±ä¼å徿¯è¾ç®åã
=item * æ©å±ç»ä»¶
DBIx::Class æå¸¸è§çæä»¶æä¸¤ç§ï¼ä¸ç§æ¯ ResultSet çæä»¶ï¼éè¿ use base 'DBIx::Class::ResultSet';ï¼ï¼å¦ä¸ç§å°±æ¯ä½ä¸ºç»ä»¶ã
ResultSet çæä»¶ä¸è¬éè¿è¦ç L<DBIx::Class::ResultSet> ç彿°ï¼å¦æåç L<DBIx::Class::ResultSet::Void>ï¼ï¼æè
å¦å¤æä¾æä¸ªå½æ°ãï¼è¿æäºæä»¶å¦ L<DBIx::Class::QueryLog> å°±ä¸è¯¦ç»ä»ç»äºï¼
å¦ä¸ç§ä½ä¸ºç»ä»¶çæä»¶æ´ä¸ºå¸¸è§ã详ç»çåè L<DBIx::Class::Manual::Component>ï¼ä¸é¢åªåç®åä»ç»ã
ç¼åç»ä»¶ä¸è¬é½éè¦è¦çåæå½æ°ï¼è¯·æ³¨æ load_components ç顺åºï¼è¿é使ç¨äº C<Class::C3> æ¥åä¸ä¸ªä¾æ¬¡è°ç¨ã
sub insert {
my $self = shift;
# Do stuff with $self, like set default values.
return $self->next::method( @_ );
}
常è§çç»ä»¶æ L<DBIx::Class::UTF8Columns>, L<DBIx::Class::UUIDColumns> çã代ç 齿¯æ¯è¾ç®åï¼å¯ä»¥æ¥çæºä»£ç è¿è¡é
读ã
=back
=head2 FAQ
=over 4
=item * è·åå½ä¸ª row
resultset('Errors')->search( { cond => 'bla' } )->first;
resultset('Errors')->single( { cond => 'bla' } );
->first ä¸ ->single ä¸åä¹å¤å¨äº ->first ä¼äº§ç C<cursor>, è ->single ä¸ä¼ãæä»¥ single ç¥å¾®å¿«ä¸ç¹ã使¯éè¦æ³¨æçå ç¹æ¯
=over 4
=item * single éä¸è½æå±æ§
->single( { cond => 'bla' }, { order_by => 'rating' } ); # Wrong
->search( { cond => 'bla' }, { order_by => 'rating' } )->single; # Right
=item * single åªè½è¿å䏿¡è®°å½
å½ single éè°ç¨ç SQL è¿åå¤äºä¸æ¡æ°æ®æ¶ï¼åå°ä¼æè¦åãå¦æä½ ç¡®å®çç¥éä½ è¦ç¨ single å¨å¤æ¡æ°æ®éï¼å¯ä»¥ä½¿ç¨ rows
->search( { cond => 'bla' }, { rows => 1 } )->single; # Right
=back
å¦ä¸ç§è·åæ¹å¼æ¯ä½¿ç¨
resultset('Errors')->search( { cond => 'bla' } )->slice(0);
å®å°ä½¿ç¨ LIMIT/OFFSET ç´æ¥å¾å°ä¸æ¡æ°æ®ã
=item * 夿ç search
建议é
读 L<DBIx::Class::Manual::Cookbook> å L<SQL::Abstract>
resultset('XXX')->search( {
requestor => 'inna',
worker => ['nwiger', 'rcwe', 'sfz'],
status => { '!=', 'completed' }
} );
# SQL:
# FROM xxx WHERE
# ( requestor = ? ) AND ( status != ? )
# AND ( worker = ? OR worker = ? OR worker = ? )
resultset('XXX')->search( {
date_entered => { '>' => \["to_date(?, 'MM/DD/YYYY')", "11/26/2008"] },
date_expires => { '<' => \"now()" }
} );
# SQL:
# FROM xxx WHERE
# date_entered > "to_date(?, 'MM/DD/YYYY') AND date_expires < now()
resultset('XXX')->search( {
-or => [
-and => [a => 1, b => 2],
-or => [c => 3, d => 4],
e => [-and => {-like => 'foo%'}, {-like => '%bar'} ]
],
} );
# SQL:
# FROM xxx WHERE
# ( ( ( a = ? AND b = ? )
# OR ( c = ? OR d = ? )
# OR ( e LIKE ? AND e LIKE ? ) ) )
=item * as_query
å¦æä½ å¯¹æåç ->search ä¸å¤ªç¡®å®ï¼ä½ å¯ä»¥ä½¿ç¨ ->as_query æ¥ debug
$schema->resultset('user')->search( {
user_id => { 'IN', [1, 2] },
-or => [
last_visit => { '>', time() - 86400 },
last_update => { '>', time() - 86400 },
]
}, {
columns => ['username'],
rows => 1,
} )->as_query;
[ '(SELECT me.username FROM user me
WHERE ( ( ( last_visit > ?
OR last_update > ? )
AND user_id IN ( ?, ? ) ) )
LIMIT 1)',
[ 'last_visit', 1242290843 ]
... ]
=back
=head2 èµæº
=over 4
( run in 0.579 second using v1.01-cache-2.11-cpan-5837b0d9d2c )