[font="Tahoma"][rtl]حتماً تا حالا براتون پیش اومده که فرضاً بخواین فقط ایمیل کاربرانی که فعال شدن رو داشته باشین. راه حلی که اکثر افراد میرن اینه:[/rtl][/font]
$emails = array();
foreach(Users::model()->findAll('active=1') as $user) {
$emails[] = $user->email;
}
[font="Tahoma"][rtl]حالا اگه فیلدهایی که میخواین استخراج بشه بیشتر بود چی؟ قطعاً دردسرتون بیشتر میشه و تازه این روش مثل مطلب شماره 2 همین تاپیک، مشکل مصرف زیاد حافظه رو داره. اما روشی که من بعنوان جایگزین میخوام معرفی کنم چیه؟
توی پوشه protected/components این کد رو به اسم ActiveRecord.php ذخیره کنید:[/rtl][/font]
class ActiveRecord extends CActiveRecord
{
public function findColumn($columns, $condition = '', $params = null)
{
if($condition instanceOf CDbCriteria) {
$criteria = $condition;
}
else {
$criteria = new CDbCriteria;
if(is_array($condition)) {
foreach($condition as $k => $v) {
$criteria->{$k} = $v;
}
}
else {
$criteria->condition = $condition;
$criteria->params = $params;
}
$criteria->select = $columns;
}
$data = array();
$cols = array_map('trim', explode(',', $columns));
foreach($this->findAll($criteria) as $model) {
$row = array();
foreach($cols as $col) {
$row[$col] = $model->attributes[$col];
}
$data[] = $row;
}
return $data;
}
}
[font="Tahoma"][rtl]حالا کافیه هر مدلی که میخواین قابلیت جدید findColumn رو داشته باشه، بجای CActiveRecord خود فریمورک از ActiveRecord ما مشتق بشه. برای مثال:[/rtl][/font]
class Users extends ActiveRecord { ... }
[font="Tahoma"][rtl]و حالا چطور از این متد استفاده میکنیم؟ خیلی ساده است:[/rtl][/font]
print_r(Users::model()->findColumn('email', 'active=1');
[font="Tahoma"][rtl]میتونید چند ستون رو هم داشته باشین:[/rtl][/font]
print_r(Users::model()->findColumn('username,password', 'active=:active', array(':active'=>1)));
[font="Tahoma"][rtl]تازه میتونید از تمام قابلیتهای Criteria هم استفاده کنید:[/rtl][/font]
$criteria = new CDbCriteria;
$criteria->addSearchCondition('name', 'ali');
foreach(Users::model()->findColumn('email', $criteria) as $user) {
echo '<p>' . $user['email'] . '</p>' . PHP_EOL;
}
[font="Tahoma"][rtl]الان این دستورات به راحتی به شما آدرس ایمیل کاربرانی که توی فیلد name اونها کلمه ali ذکر شده رو نشون میده.[/rtl][/font]