PDA

View Full Version : تغییر نوع فیلدها وتبدیل به string هنگام استفاده کردن از کلاسهای دیتابیس Yii مثل CActiveRecord



shpegah
پنج شنبه 30 مرداد 1393, 10:41 صبح
بهترین راهی که بتونیم از نوع واقعی فیلدها در ویو استفاده کنیم چیه ؟
باید فیلدهارو یکی یکی در آرایه خودمون تغییر نوع دهیم ؟
من یک جدول دارم فیلد اول string و فیلد دوم عددی برای فیلد دوم حتما لازمه فیلدها رو عددی داشته باشم ولی string میده خودم یکی یکی تبدیل نوعش کنم ؟
راه بهتری میشه پیشنهاد بدید
ممنون

MMSHFE
جمعه 31 مرداد 1393, 08:15 صبح
خود PHP موقع استفاده تبدیل نوع میکنه ولی اگه لازمه فیلدی حتماً تغییر نوع داده بشه، میتونید از رفتار afterFind توی متد استفاده کنید:

protected function afterFind()
{
settype($this->age, 'integer');
}

shpegah
شنبه 01 شهریور 1393, 09:01 صبح
نه من میخوام تغییر نوع نده امکانش هست ؟ یا نه مامجبوریم پس از تغییر نوع خودمون مشابه روش شما تغییر بدیم به نوعی که بوده ؟

MMSHFE
شنبه 01 شهریور 1393, 09:14 صبح
لازم نیست. PHP به نوع متغیر حساس نیست. بنابراین میتونید مثل یک رشته، عدد اعشاری یا صحیح، مقدار منطقی و... باهاش تو برنامه برخورد کنید و موقع ذخیره کردن، خود MySQL دوباره به نوع مخصوص فیلد مربوطه تبدیلش میکنه. Validation Ruleهای Yii هم فقط برای اعتبارسنجی مقادیر واردشده هستن و عملاً کاری به نوع فیلد ندارن. برای مثال شما یک فیلد varchar رو میتونید با Ruleها طوری تنظیم کنید که فقط عدد بگیره (مثل کد ملی یا شماره حساب بانکی)

shpegah
شنبه 01 شهریور 1393, 14:51 عصر
وقتی یک اکستشن داریم که نیاز به نوعهای واقعی دارد مجبوریم خودمان نوعش را به حالت اولیه برگردانیم
مثلا در اکستنشنی که برای کشیدن نمودارها از api گوگل استفاده میکنه معمولا کوئری که برای ایجاد نمودار پاس میشود دو فیلد داریم که اولی را معمولا string ودومی را عددی میگیریم ولی چون آرایه پاس شده فیلدهای string شده داره مجبوریم مجددا فیلد عددی را که الان string شده را عددی کنیم
موارد زیاد پیش خواهد آمد که نوع اصلی برای ما مهم باشد وبالاخص وقتی کدهای ما دینامیک باشد کار مشکل تر میشود

MMSHFE
شنبه 01 شهریور 1393, 15:52 عصر
والا بنظرم اون اکستنشن غیر حرفه ای نوشته شده که به نوع متغیر حساسیت نشون میده چون PHP خودش سخت گیر نیست اونوقت این واسه چی گیر میده؟ بهرصورت همونطور که گفتم میشه تبدیل کرد ولی راه منطقی تر اینه که توی اکستنشن مربوطه، با settype نوع رو تبدیل کنید. اگه کلاً لازمه تبدیل نوع بشه هم که روشش رو گفتم ولی در کل بازم میگم لازم نیست چون تو PHP مثلاً اگه عبارت '12345' رو به تابع in_int بدین، نتیجه true برمیگردونه.

shpegah
یک شنبه 02 شهریور 1393, 08:46 صبح
در مورد مثالی که خدمتتون عرض کردم بعید میدونم اکستنشن غیر حرفه ای بوده باشه ممکنه من غیر حرفه ای کار کردم . به این مثال یک نگاهی بندازید


<?php
$myTitle= array('Task', 'Hours per Day');
$myData= array(
$myTitle,
array('Work', 11),
array('Eat', 2),
array('Commute', 2),
array('Watch TV', 2),
array('Sleep', 7)
);
//very useful google chart
$this->widget('ext.Hzl.google.HzlVisualizationChart', array('visualization' => 'PieChart',
'data' =>$myData,
'options' => array('title' => 'My Daily Activity')));

$this->widget('ext.Hzl.google.HzlVisualizationChart', array('visualization' => 'LineChart',
'data' => $myData,
'options' => array('title' => 'My Daily Activity')));
?>

وکاملا درست عمل میکنه در حالیکه اگر


<?php
$myTitle= array('Task', 'Hours per Day');
$myData= array(
$myTitle,
array('Work', '11'),
array('Eat','2'),
array('Commute', '2'),
array('Watch TV', '2'),
array('Sleep', '7')
);
//very useful google chart
$this->widget('ext.Hzl.google.HzlVisualizationChart', array('visualization' => 'PieChart',
'data' =>$myData,
'options' => array('title' => 'My Daily Activity')));

$this->widget('ext.Hzl.google.HzlVisualizationChart', array('visualization' => 'LineChart',
'data' => $myData,
'options' => array('title' => 'My Daily Activity')));
?>


پیغام
Data column(s) for axis #0 cannot be of type string



میده
که به نظر منطقی هم هست نمیتونه تفسیر درستی برای رسم نمودار از نوع string داشته باشه ولی تبدیل به عدد هم نمیکنه

MMSHFE
یک شنبه 02 شهریور 1393, 11:06 صبح
خوب همین دیگه وقتی تبدیل به عدد نمیکنه یعنی مشکل داره و خودتون باید زحمتشو بکشین. البته نه توی تمام برنامه. هرجا میخواین به این اکستنشن بفرستین باید تبدیل کنید با settype یا از intval استفاده کنید.

shpegah
سه شنبه 04 شهریور 1393, 09:37 صبح
ممنون پس بااین حساب بهتره زحمت تهیه اکستنشنش را خودمون بکشیم چون توی اکستنشنهایی که پیدا کردم فقط این خوب کار میکرد تبدیل نوع روی دیتا های دیتابیس در بعضی مواقع که باحجم زیاد دیتا کار میشه ممکنه زمانبری زیادی داشته باشه

MMSHFE
سه شنبه 04 شهریور 1393, 09:46 صبح
راه حل زیاده. یکیش اینه که توی phpclasses.org دنبال کلاسهای کار با نمودار باشین و هرکدوم دیدین خوبه رو بصورت کامپوننت تبدیل کنید و توی پوشه protected/components بگذارین. یک راه دیگه هم اینه که از معماری Factory یا Adapter استفاده کنید. برای مثال، یک کلاس خودتون بسازین که توی متدهاش مقادیر رو میگیره و تبدیل نوع میکنه و بعد میده به اکستنشنی که استفاده کردین تا نمودار رو بسازه. اینطوری دیگه دردسر ندارین و توی کل پروژه هم لازم نیست نوع متغیرها عوض بشه. فقط کافیه هرجا از اکستنشن استفاده کرده بودین، از کلاس خودتون شئ بسازین و مقادیر رو به اون بدین.