Codeigniter query and structure - codeigniter

I have a model with two queries:
function listCategories()
{
$result=$this->db->query("select * from table")->result();
return $result;
}
function listSubCategories($var)
{
$result=$this->db->query("select * from table where field=$var")->result();
return $result;
}
Then i call the first function on my controller:
$data['rows']=$this->my_model->listCategories();
The problem is: now i need to call the second function (listSubCategories()) and the $var that i need to pass to it, is a field from the database which is returned by the listCategories() function
What's the best way to handle a situation like this?
Thanks in advance.

Just pass the return from the first function into your call for the second function:
$data=$this->my_model->listCategories();
$sub=$this->my_model->listSubCategories($data->row()->field_name);

Related

How to get a value in controller from get method and return it back to another view?

The problem looks basic but it is really painful!
I'm using get method and getting value in controller and I want the same value to return in another view.
How can I do that???
Please help!!!
This is my function from controller:
public function guest(){
if (Input::get('Cash On Delivery')){
$get = Input::get('Cash On Delivery');
return Redirect::to('guest/guestview/'.$get);
}
Well, with regards to your answer, using $_REQUEST directly is not Laravel's way of doing things :(
I believe this is better
public function guest(Request $request)
{
if ($request->payment_method == ('Cash On Delivery'))
{
return view('guest/guestview', ['guest'=>$request->payment_method]);
}
}
Ok Guys, I figured it out,
Just do this below.
public function guest(Request $request){
if ($request->payment_method == ('Cash On Delivery')){
$get = $_REQUEST['payment_method'];
return view('guest/guestview', compact('get'));
}

Route to two methods of controller with one row in Laravel 4

It is simple to route this way:
Route::get('user/profile', 'PaymentsController#profile');
Route::get('user/delete', 'PaymentsController#delete');
I want to do this with one row:
Route::get('user/{subsection}', 'PaymentsController#'.$subsection);
but my syntax seems to be wrong. Is it possible to be done with one row? It would be nice if it is possible.
No, you can't do that, but you can make proxy method
Route::get('user/{subsection}', 'PaymentsController#profileDelete');
And method will looks like
public function profileDelete($subsection) {
return $this->$subsection();
}
public function profile(){}
public function delete(){}
Also, you can bind {subsection}
Route::bind('subsection', function ($subsection) {
if (!in_array($subsection, ['profile', 'delete'])) {
throw new Exception;
}
return $subsection;
});
Not exactly one row, but you can do this:
Route::get('user/{subsection}', function($subsection){
if(!method_exists('PaymentsController', $subsection)){
App::abort(404);
}
return App::make('PaymentsController')->callAction($subsection);
});
Alternatively to the method_exists you could also use a route condition to only allow a predefined set of subsections:
Route::get('user/{subsection}', function($subsection){
return App::make('PaymentsController')->callAction($subsection);
})->where('subsection', '(profile|delete)');

getting the value of the single field output using the codeigniter active record

the following function is supposed to read the name of the given asset code from the database. but it triggers the error: "Trying to get property of non-object"
function sban_name($asset){
$this->db->select('name');
$this->db->from('asset_types');
$this->db->where('code',$asset);
return $this->db->get()->result()->row('name');
}
All I want is to have the name of the asset returned back to the controller! Your help is highly appreciated!
Use row() like,
return $this->db->get()->row()->name;
Use row() for a single row, and result() for multiple rows.
do like this, asset_types is your table name
function sban_name($asset){
$this->db->select('name');
$this->db->from('asset_types');
$this->db->where('code',$asset);
return $this->db->get('asset_types');
}
And in your controller acess it like
$result=$this->modelname->sban_name('$asset')->row();
$name=$result->name;
I think it's important to check if the record that satisfies the conditions even exists in the database. Code for the model:
function sban_name($asset){
$this->db->select('name');
$this->db->from('asset_types');
$this->db->where('code',$asset);
$row = $this->db->get()->row();
if (isset($row)) {
return $row->name;
} else {
return false;
}
}
Simply call the function from the controller like so:
$response = $this->model_name->sban_name($asset)
Try this code of block , I already checked and works fine:
function sban_name($asset)
{
$this->db->select('name');
$this->db->from('asset_types');
$this->db->where('code', $asset);
return $this->db->get()->row()->name;
}

Codeigniter mimic where_in() functionality with a simple where() statement

I have a method which can take a variable $where. This is then passed to a $this->db->where($where); statement.
I am trying to mimic the functionality of where_in() for one particular function.
I have a list of IDs in either array format or imploded string format.
I have tried passing $where=array('blog.ID IN'=>'1,3');
to the method to no avail.
This is causing WHEREblog.IDIN '1,3'
to be output instead of WHEREblog.IDIN '1','3'
Can anyone advise how i can use codeigniters where() function to mimic what its where_in() function does?
Thanks
Try:
$array = [1,3];
$where='blog.ID IN' . join(',', $array);
Couldn't you do something like this?
function your_db_thingie($where)
{
$this->db->select('*');
if (is_array($where))
{
$this->db->where_in('field', $where);
}
else
{
$this->db->where('field', $where);
}
return $this->db->get('database');
}

Passing arguments and conditions to model in codeigniter

I'm adding some models to a project, and was wondering if there is a "best practice" kind of approach to creating models:
Does it make sense to create a function for each specific query?
I was starting to do this, then had the idea of creating a generic function that I could pass parameters to. e.g:
Instead of
function getClients(){
return $this->db->query('SELECT client_id,last FROM Names ORDER BY id DESC');
}
function getClientNames($clid){
return $this->db->query('SELECT * FROM Names WHERE client_id = '.$clid);
}
function getClientName($nameID){
return $this->db->query('SELECT * FROM Names WHERE id ='.$nameID);
}
}
Something like
function getNameData($args,$cond){
if($cond==''){
$q=$this->db->query('SELECT '.$args.' FROM Names');
return $q;
}else{
$q=$this->db->query('SELECT '.$args.' FROM Names WHERE '.$cond);
return $q;
}
}
where I can pass the fields and conditions (if applicable) to the model. Is there a reason the latter example would be a bad idea?
Thanks!
I think it would actually be a better idea to use CI's Active Record to compile the queries.
An example:
function all_clients($select)
{
$this->db->select($select);
return $this->_get_client_data();
}
function single_client($select, $id = "")
{
// validate $id
$this->db->select($select);
$this->db->where("id", $id);
$this->db->limit(1);
return $this->_get_client_data();
}
// Only called by a method above once the query parameters have been set.
private function _get_client_data()
{
$q = $this->db->get("clients");
if($q->num_rows() > 0)
{
return $q->result_array();
}
return FALSE;
}
CI's Active Record makes all the stuff you were wanting to much easier. You can imagine setting up your public functions to conditionally set a number of options before actually calling $this->db->get().
I guess you would call _get_client_data a catch-all (?) and running all your data retrieval through a single method makes stuff like error handling much easier to maintain.
NOTE: Always remember to validate data like this. I know you do, but I'm just repeating it.

Resources