PDA

View Full Version : گفتگو: بررسی کد تابع findall() در فریمورک cakephp



Veteran
چهارشنبه 02 مرداد 1392, 18:45 عصر
امروز نیاز داشتم یک تابعی مثل findalll فریمورک cakephp بنویسم.اما نتونستم.
رفتم سراغ خوده فریمورک که ببینم چجوری داره کوئری رو میسازه :کف:
کدش رو پیدا کردم به این رسیدم


function findAll($conditions = null, $fields = null, $order = null, $recursive = null) {
return $conditions;
}

یکی به من بگه قضیه چیه :کف: این تابع چرا اینجوریه !!!!!!!
کدش همینه یعنی ؟
کجا داره کوئری میسازه کجا داره اجرا میکنه و ... :متفکر:

zoghal
چهارشنبه 02 مرداد 1392, 23:47 عصر
رسما همچین تابعی در کیک وجود خارجی ندارد.

http://api.cakephp.org/2.3/source-class-Model.html#36-3466

نمی دونم این تابع رو از کجا بدست آوردید. اما فکر می کنم شما دنبال این هستید. توابع جادویی کیک:

http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#magic-find-types

cybercoder
شنبه 05 مرداد 1392, 21:37 عصر
تابع findAll در نسخه های اولیه cake مثل 1.1 استفاده می شد (بالشخصه بسیار استفاده کردم) و به سن cake ی عده ای که خودشون رو خیلی cake باز می دونن و بقیه رو دست پایین، قد نمیده.
http://book.cakephp.org/1.1/en/models.html#retrieving-your-data
اما این که چجوری بر می گردونه که مشخصه Query String میسازه و بعد Exec می کنه. و با کمی بازی بازی با آرایه ها نتیجه رو به صورت Cleanو Structured بر می گردونه سورس 1.1 رو نگاه کن متوجه میشی.

Veteran
سه شنبه 29 مرداد 1392, 18:03 عصر
ای بابا :لبخند:
ببخشین من اشتباه نوشتم
متد find هست


function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
if (!is_string($conditions) || (is_string($conditions) && !array_key_exists($conditions, $this->_findMethods))) {
$type = 'first';
$query = array_merge(compact('conditions', 'fields', 'order', 'recursive'), array('limit' => 1));
} else {
list($type, $query) = array($conditions, $fields);
}

$this->findQueryType = $type;
$this->id = $this->getID();

$query = array_merge(
array(
'conditions' => null, 'fields' => null, 'joins' => array(), 'limit' => null,
'offset' => null, 'order' => null, 'page' => null, 'group' => null, 'callbacks' => true
),
(array)$query
);

if ($type != 'all') {
if ($this->_findMethods[$type] === true) {
$query = $this->{'_find' . ucfirst($type)}('before', $query);
}
}

if (!is_numeric($query['page']) || intval($query['page']) < 1) {
$query['page'] = 1;
}
if ($query['page'] > 1 && !empty($query['limit'])) {
$query['offset'] = ($query['page'] - 1) * $query['limit'];
}
if ($query['order'] === null && $this->order !== null) {
$query['order'] = $this->order;
}
$query['order'] = array($query['order']);

if ($query['callbacks'] === true || $query['callbacks'] === 'before') {
$return = $this->Behaviors->trigger($this, 'beforeFind', array($query), array(
'break' => true, 'breakOn' => false, 'modParams' => true
));
$query = (is_array($return)) ? $return : $query;

if ($return === false) {
return null;
}

$return = $this->beforeFind($query);
$query = (is_array($return)) ? $return : $query;

if ($return === false) {
return null;
}
}

if (!$db =& ConnectionManager::getDataSource($this->useDbConfig)) {
return false;
}

$results = $db->read($this, $query);
$this->resetAssociations();

if ($query['callbacks'] === true || $query['callbacks'] === 'after') {
$results = $this->__filterResults($results);
}

$this->findQueryType = null;

if ($type === 'all') {
return $results;
} else {
if ($this->_findMethods[$type] === true) {
return $this->{'_find' . ucfirst($type)}('after', $query, $results);
}
}
}



$options=array('joins' => array(
array(
'conditions' => array(
'Profile.user_id = User.id'
),
'table' => 'profiles',
'alias' => 'Profile',
'type' => 'left',
),
),
'limit' => '10',
'offset' => '5',
);
$data=$this->find('all',$options');

من ی برنامه واسه کارام نوشتم تا حدودی جواب گوی نیاز ها هست
که اسم جدول رو بهش میدی
یک فایل که یک کلاس داره با متد های Select,insert,update و...
رو داره طبق همون جدولی که بهش دادیم.
یک کلاس دیتابیس هم داریم که کلاس اولی متد هارو میده به کلاس دیتابیس و اجرا میکنه
من فقط صدا میزنم متد هارو
مثلا

CONTENT_class::content_list_Insert($_POST['title'], $_POST['post_editor'], $_POST['cat_Name'], time(), substr( $_POST['tags'],-strlen($_POST['tags'])+1,strlen($_POST['tags'])))
اما بعضی وقتا نیاز به یک کوئری دارم که باید مستقیم خودم بدم به دیتابیس چراکه متدی ندارم به مشخصات رو بدم و کوئری رو بسازه ! یعنی داینامیک باشه


$this->MessageArshive=Database::Execute_Query("SELECT m1.id, m1.title, m1.timestamp, count( m2.id ) AS reps, users.id AS userid, users.username
FROM messages AS m1, messages AS m2, users
WHERE (
(
m1.user1 =:myid
AND m1.user1read = 'yes'
AND users.id = m1.user1
)
OR (
m1.user2 =:myid
AND m1.user2read = 'yes'
AND users.id = m1.user1
)
)
AND m1.id2 = '1'
AND m2.id = m1.id
GROUP BY m1.id
ORDER BY m1.id DESC",array (':myid' => $_SESSION['userID']));

نیاز به یک تابع مثل همین find دارم که من مشخصات رو بدم و خودش کوئری رو بسازه ! اما چجوریش رو موندم ! که به چه شکل بنویسم که انواع کوئری رو بسازی با توجه به پارامتر ها
رفتم سراغ کیک اما چیزی نفهمیدم ! این الان داره چجوری کوئری رو میسازه !؟