Я хочу получить данные в формате cakephp, например, по таблице (модели)
Подобно:
select user.*,category.*,area.* from user left join category on user.cat_id=category.id left join area on user.area_id=area.id array( [0] => Array( [user]=>array( [user_id] => 1 [user_name] => test user ) [category]=>array( [category_id] => 1 [category_name] => test cat ) [area]=>array( [area_id] => 1 [area_name] => area1 ) ) [1] => Array( [user]=>array( [user_id] => 2 [user_name] => test user ) [category]=>array( [category_id] => 2 [category_name] => test cat ) [area]=>array( [area_id] => 2 [area_name] => area2 ) ) )
Всякий раз, когда мы запускаем запрос соединения, извлекается вся группа данных по таблице.
Итак, как это сделать?
Структура таблицы и значения для area
таблицы:
CREATE TABLE IF NOT EXISTS `area` ( `id` int(11) NOT NULL, `a_name` varchar(20) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO `area` (`id`, `a_name`) VALUES (1, 'bapunagar'), (2, 'bopal');
Структура и значения таблицы для category
таблицы
CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c_name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; INSERT INTO `category` (`id`, `c_name`) VALUES (1, 'food');
Структура таблицы и значения для user
таблицы:
CREATE TABLE IF NOT EXISTS `user` ( `u_id` int(11) NOT NULL AUTO_INCREMENT, `u_name` varchar(20) NOT NULL, `cat_id` int(11) NOT NULL, `area_id` int(11) NOT NULL, PRIMARY KEY (`u_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; INSERT INTO `user` (`u_id`, `u_name`, `cat_id`, `area_id`) VALUES (1, 'pragnesh', 1, 1), (2, 'tejash', 1, 2);
Ниже приведен код для достижения желаемого массива:
$sql = "select user.*,category.*,area.* from user left join category on user.cat_id=category.id left join area on user.area_id=area.id"; $res = mysql_query ($sql); $finalArray = array(); while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $array = array(); for ($i = 0; $i < mysql_num_fields($res); ++$i) { $table = mysql_field_table($res, $i); $field = mysql_field_name($res, $i); $array[$table][$field] = $row[$field]; } $finalArray[] = $array; } print_r($finalArray); Outputs as: Array ( [0] => Array ( [user] => Array ( [u_id] => 1 [u_name] => pragnesh [cat_id] => 1 [area_id] => 1 ) [category] => Array ( [id] => 1 [c_name] => food ) [area] => Array ( [id] => 1 [a_name] => bapunagar ) ) [1] => Array ( [user] => Array ( [u_id] => 1 [u_name] => pragnesh [cat_id] => 1 [area_id] => 1 ) [category] => Array ( [id] => 1 [c_name] => food ) [area] => Array ( [id] => 1 [a_name] => bapunagar ) ) ... )
Надеюсь, это поможет вам.
Можете ли вы проверить, разрешает ли это вашу проблему. Я получил результаты, но, пожалуйста, проверьте, подходит ли это вам:
$query = mysql_query("select * from user") or die(mysql_error()); $i = 0; $result = array(); while($row = mysql_fetch_array($query)){ $result[$i]['user']['user_id'] = $row['u_id']; $result[$i]['user']['user_name'] = $row['u_name']; $cat_query = mysql_query("select * from category where id = {$row['cat_id']}") or die(mysql_error()); $y = 0; while($cat_row = mysql_fetch_array($cat_query)){ $result[$i]['category']['category_id'] = $cat_row['id']; $result[$i]['category']['category_name'] = $cat_row['c_name']; $y++; }// while $area_query = mysql_query("select * from area where id = {$row['area_id']}") or die(mysql_error()); $z = 0; while($area_row = mysql_fetch_array($area_query)){ $result[$i]['area']['area_id'] = $area_row['id']; $result[$i]['area']['area_name'] = $area_row['a_name']; $z++; }// while $i++; }// while // Here I just show results echo "<pre>"; var_dump($result); echo "</pre>";
Просто упомянуть. Я использовал старую моду mysql_connect
. Вы можете использовать все, что захотите ( PDO
, mysqli
), но тогда вы должны брать массивы по-разному, иначе выполняйте запрос …
Попробуй это,
$this->loadModel('User'); //Load Model $this->User->find('all',array( 'joins' => array( array( 'table' => 'category', 'alias' => 'Categories', 'type' => 'LEFT', //LEFT JOIN 'conditions' => array( 'Categories.id = User.cat_id' ) ), array( 'table' => 'area', 'alias' => 'Areas', 'type' => 'LEFT', //LEFT JOIN 'conditions' => array( 'Areas.id = User.area_id' ) ) ), 'fields' => array('Users.*','Areas.*','Categories.*') //Display all the fields ));
Надеюсь, это поможет вам. Благодарю.