Nested Meta Query with post_where and multiple relation keys - mysql

I'm trying to add aWP_Query with
post_where filter and WP_META_QUERY to a wordpress main query:
function example_range_m2( $where ) {
$min_price = doubleval($_GET['min-price']);
$max_price = doubleval($_GET['max-price']);
$query_args = array( 'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'PREFIX_min_property_price_m2',
'value' => array($min_price, $max_price),
'type' => 'NUMERIC',
'compare' => 'BETWEEN'
),
array(
'key' => 'PREFIX_max_property_price_m2',
'value' => array($max_price, $min_price),
'type' => 'NUMERIC',
'compare' => 'BETWEEN'
),
) );
$query_args2 = array('meta_query' => array(
'relation' => 'AND',
array(
'key' => 'PREFIX_min_property_price_m2',
'value' => $min_price,
'compare' => '<=',
'type' => 'NUMERIC'
),
array(
'key' => 'PREFIX_max_property_price_m2',
'value' => $max_price,
'compare' => '>=',
'type' => 'NUMERIC'
),
));
$meta_query = new WP_Meta_Query();
$meta_query->parse_query_vars( $query_args );
$mq_sql = $meta_query->get_sql(
'post',
$wpdb->posts,
'ID',
null
);
$tmp_one = str_replace('mt1', 'example_postmeta', $mq_sql['where']) . ' ';
echo $tmp_one;
$meta_query = new WP_Meta_Query();
$meta_query->parse_query_vars( $query_args2 );
$mq_sql = $meta_query->get_sql(
'post',
$wpdb->posts,
'ID',
null
);
$tmp_two = str_replace('mt1', 'example_postmeta', $mq_sql['where']) . ' ';
$where .= $tmp_one . ' OR ' . $tmp_two;
return $where;
}
The first query_args have to determine whether one of the custom_meta_field value are between the given range.
The secound query_args have to determine whether values in the database make a range that contains given range.
I need to make wordpress to query database:
SELECT post_meta WHERE
(meta_value1 BETWEEN min MAX max) OR (meta_value2 BETWEEN min AND max)
OR (meta_value1 <= min AND meta_value2 >= max)
var_dump of main wordpress query gives me following request:
SELECT SQL_CALC_FOUND_ROWS example_posts.id
FROM example_posts
INNER JOIN example_postmeta
ON ( example_posts.id = example_postmeta.post_id )
WHERE
1 = 1
AND example_posts.post_type = 'property'
AND (
example_posts.post_status = 'publish'
OR
example_posts.post_status = 'private'
)
AND ( example_postmeta.meta_key = 'PREFIX_min_property_price_m2' )
AND (
(
example_postmeta.meta_key = 'PREFIX_min_property_price_m2'
AND
Cast(example_postmeta.meta_value AS signed) BETWEEN '1000' AND '9000'
)
OR
(
example_postmeta.meta_key = 'PREFIX_max_property_price_m2'
AND
Cast(example_postmeta.meta_value AS signed) BETWEEN '9000' AND '1000'
)
)
OR
And (
(
example_postmeta.meta_key = 'PREFIX_min_property_price_m2'
AND
Cast(example_postmeta.meta_value AS signed) <= '1000'
)
AND
(
example_postmeta.meta_key = 'PREFIX_max_property_price_m2'
AND Cast(example_postmeta.meta_value AS signed) >= '9000'
)
)
GROUP BY example_posts.id
ORDER BY example_postmeta.meta_value + 0 ASC
LIMIT 0, 4
I need this to work with main WP_Query in order to maintain WP and template logic.
I have one post that should work with request and it just doesn't.
I'm a SQL Noob if that is not obvious ;)

Ok. After a strong brainstorming session with myself and a piece of paper and pen I understood that I can rephrase my query / 'problem' with totally different conditions.
I was trying write a query that will return all the objects with a range of values that meet a range. I decided that I will work on maximum and minimum values in a different way, so I came up with meta query that could be used in standard WP_QUERY:
/* Logic for Min and Max Price Parameters */
if( isset($_GET['min-price']) && ($_GET['min-price'] != 'any') && isset($_GET['max-price']) && ($_GET['max-price'] != 'any') ){
$min_price = doubleval($_GET['min-price']);
$max_price = doubleval($_GET['max-price']);
if( $min_price >= 0 && $max_price > $min_price ){
$meta_query[] = array(
'key' => 'EXAMPLE_max_property_price_m2',
'value' => $min_price,
'type' => 'NUMERIC',
'compare' => '>='
);
$meta_query[] = array(
'key' => 'EXAMPLE_min_property_price_m2',
'value' => $max_price,
'type' => 'NUMERIC',
'compare' => '<='
);
}
}elseif( isset($_GET['min-price']) && ($_GET['min-price'] != 'any') ){
$min_price = doubleval($_GET['min-price']);
if( $min_price > 0 ){
$meta_query[] = array(
'key' => 'EXAMPLE_max_property_price_m2',
'value' => $min_price,
'type' => 'NUMERIC',
'compare' => '>='
);
}
}elseif( isset($_GET['max-price']) && ($_GET['max-price'] != 'any') ){
$max_price = doubleval($_GET['max-price']);
if( $max_price > 0 ){
$meta_query[] = array(
'key' => 'EXAMPLE_min_property_price_m2',
'value' => $max_price,
'type' => 'NUMERIC',
'compare' => '<='
);
}
}
This allowed me to cover all the objects I while comparing ranges.

Related

JSON to VB.NET Deserialize Coding

I have a column in a table where all the details of the bill are getting stored. My brother used PHP web project to do that. Now I am trying to deserialize in VB.NET
Here is the PHP code (Controller)
public function add_to_list() {
$this->load->model('product_model', 'Product');
$pdts = $this->Product->get_data(true);
$available = $this->in_cart($this->input->post('id'));
$cart_qty = $available ? $available : 0;
if (!is_numeric($this->input->post('qty')) || !$this->input->post('id')) {
$res['success'] = false;
$res['msg'] = "Please enter the valid input";
} else {
$discount_percentage = $this->input->post('discount_percentage') ? $this->input->post('discount_percentage') : 0;
$discount_rate = $pdts->selling_price * ($discount_percentage / 100);
$final = $pdts->selling_price - $discount_rate;
$igst = $pdts->igst;
$igst_amt = calculate_price_by_precentage($this, $final, $pdts->igst);
$gross = $pdts->selling_price;
$total = $final + $igst_amt;
// $total = $gross + $igst_amt;
$available_qty = 5;
$data = array(
'id' => $pdts->id,
'qty' => $this->input->post('qty'),
'price' => $pdts->final_price,
'name' => $pdts->product,
'options' => array(
'product_id' => $pdts->id,
'product_hsn' => $pdts->hsn,
'product_name' => $pdts->product,
'product_unit' => $pdts->unit,
'product_rate' => $pdts->selling_price,
'product_mrp' => $pdts->mrp,
'product_gst' => $pdts->igst,
'product_cgst' => $pdts->cgst,
'product_gst_amount' => $igst_amt * $this->input->post('qty'),
'product_net_rate' => $pdts->cost_price,
'product_qty' => $this->input->post('qty'),
'product_free' => 0,
'product_discount_percentage' => $discount_percentage,
'product_discount_rate' => $discount_rate,
'product_total' => $total * $this->input->post('qty'),
'available_qty' => $available_qty,
'category' => $pdts->category,
'rate' => $pdts->selling_price,
'gross' => $gross,
'igst' => $igst,
'cgst' => $igst / 2,
'sgst' => $igst / 2,
'igst_amount' => $igst_amt,
'cgst_amount' => $igst_amt / 2,
'sgst_amount' => $igst_amt / 2,
'total' => $total //final_price($this, $pdts->selling_price, calculate_price_by_precentage($this, $pdts->selling_price, $pdts->discount), calculate_price_by_precentage($this, $pdts->selling_price, $pdts->sgst))
)
);
$this->cart->insert($data);
$this->pageViewData['final_discount'] = $this->input->post('discount') == '' ? '0' : $this->input->post('discount');
$this->pageViewData['final_discount_percentage'] = $this->input->post('discount_percentage') == '' ? '0' : $this->input->post('discount_percentage');
$this->pageViewData['ajax'] = true;
$res['success'] = true;
$res['msg'] = $this->load->view('order/cart_item', $this->pageViewData, true);
}
echo json_encode($res);
}
And this is how the cell Value looks.
> a:1:{s:32:"b3712e169500f4754be4a6a681220a96";a:7:{s:2:"id";s:2:"69";s:3:"qty";d:1;s:5:"price";d:26.25;s:4:"name";s:28:"Seeded
> Dates 200gm Wet
> Dates";s:7:"options";a:26:{s:10:"product_id";s:2:"69";s:11:"product_hsn";s:8:"08041020";s:12:"product_name";s:28:"Seeded
> Dates 200gm Wet
> Dates";s:12:"product_unit";s:2:"GM";s:12:"product_rate";s:5:"26.25";s:11:"product_mrp";s:2:"35";s:11:"product_gst";s:2:"12";s:12:"product_cgst";s:1:"6";s:18:"product_gst_amount";d:3.149999999999999911182158029987476766109466552734375;s:16:"product_net_rate";s:5:"24.70";s:11:"product_qty";s:1:"1";s:12:"product_free";i:0;s:27:"product_discount_percentage";i:0;s:21:"product_discount_rate";d:0;s:13:"product_total";d:29.39999999999999857891452847979962825775146484375;s:13:"available_qty";i:5;s:8:"category";s:9:"AD
> Seeded";s:4:"rate";s:5:"26.25";s:5:"gross";s:5:"26.25";s:4:"igst";s:2:"12";s:4:"cgst";i:6;s:4:"sgst";i:6;s:11:"igst_amount";d:3.149999999999999911182158029987476766109466552734375;s:11:"cgst_amount";d:1.5749999999999999555910790149937383830547332763671875;s:11:"sgst_amount";d:1.5749999999999999555910790149937383830547332763671875;s:5:"total";d:29.39999999999999857891452847979962825775146484375;}s:5:"rowid";s:32:"b3712e169500f4754be4a6a681220a96";s:8:"subtotal";d:26.25;}}
That looks a lot to me. As a beginner, I need a big help from you guys to get this done.

How to get the first row of a result in Yii2? (queryRow Equivalent)

how can i get the first row of result? Below is my code which is giving me an error like this Undefined index: module
if ( substr( $action, 0, 4 ) === "stl_" )
{
$query = "SELECT * FROM a_actions LEFT JOIN a_modules ON ( a_modules.id=a_actions.module_id )
WHERE a_actions.id=(SELECT dependency FROM a_actions WHERE action='{$action}') AND a_modules.module_status = 1 ";
$action = \Yii::$app->db->createCommand( $query )
->queryAll();
//print_r($action);die();
$module = $action[ 'module' ];
$action = $action[ 'action' ];
}
$action has value
Array ( [0] => Array ( [id] => 7 [module_id] => 7 [action] => index [label] => Members [dependency] => [created_by] => [created_at] => [updated_by] => [updated_at] => [is_deleted] => 0 [module] => members [module_name] => [module_status] => 1 ) )
in Yii1 i would have used
$action = \Yii::$app->db->createCommand( $query )
->queryRow();
You can use queryOne()
\Yii::$app->db->createCommand( $query )
->queryOne();
QueryOne()

GROUP and COUNT() multiple fields in CakePHP

This is my database:
week, subbizname, devicetype
20141203, common, PC
20141203, unknown, PC
20141210, KRsinKD, SP
20141210, unknown, PC
20141217, Unknown, SP
20141217, Chintai, TAB
....
I am trying to get the number of records for each unique couple devicetype/week.
Ex:
array(
20141203 => array(
'PC'=>2,
'TAB'=>0,
'SP'=>0
),
20141210 => array(
'PC'=>1,
'TAB'=>0,
'SP'=>1
),
...
.....
)
UPDATE:
I have used query:
$data = $this->Test->find('all', array(
'conditions'=>array(
'OR'=>array(
array('devicetype'=>'PC'),
array('devicetype'=>'SP'),
array('devicetype'=>'TAB'),
)
),
'fields'=>"devicetype,week,COUNT(devicetype) AS countDevice",
'group'=>"week,devicetype"
));
Thing is, it returns something like this:
(int) 0 => array(
'Test' => array(
'devicetype' => 'PC',
'week' => '20141126'
),
(int) 0 => array(
'countDevice' => '34844'
)
),
(int) 1 => array(
'Test' => array(
'devicetype' => 'SP',
'week' => '20141126'
),
(int) 0 => array(
'countDevice' => '32401'
)
),
(int) 2 => array(
'Test' => array(
'devicetype' => 'TAB',
'week' => '20141126'
),
(int) 0 => array(
'countDevice' => '4256'
)
),
(int) 3 => array(
'Test' => array(
'devicetype' => 'PC',
'week' => '20141203'
),
(int) 0 => array(
'countDevice' => '96564'
)
),
(int) 4 => array(
'Test' => array(
'devicetype' => 'SP',
'week' => '20141203'
),
(int) 0 => array(
'countDevice' => '97450'
)
),
But I do not manage to get the expected result.
Surely there must be a better way.
How can I fix this?
Using your $data variable, you can do:
$d = array();
foreach ($data as $value) {
$week = $value['Test']['week'];
if (isset($d[$week])) {
$d[$week][$value['Test']['devicetype']] = $value[0]['countDevice'];
} else {
$d[$week] = array($value['Test']['devicetype'] => $value[0]['countDevice']);
}
}
print_r($d); // $d will contain the data in your required format

How to transform this array in a json?

I have this relation CompanyhasMany Branch
And using $this->Company->find('all') output this:
(int) 1 => array(
'Company' => array(
'id' => '4',
'nome' => 'Somov',
'diretores' => 'Marcelo, Carl'
),
'Branch' => array(
(int) 0 => array(
'id' => '3',
'nome' => 'Serra',
'rua' => 'Rua teste 2 exttttt',
'numero' => '22',
'estado' => 'ES',
'cidade' => 'Etc',
'cep' => '',
'responsavel' => '',
'company_id' => '4',
'cnpj' => ''
)
)
),
(int) 2 => array(
'Company' => array(
'id' => '5',
'nome' => 'Soimpex',
'diretores' => ''
),
'Branch' => array()
)
)
I want to transform this in a json like this to use with Highchart:
[{
name: NAME OF COMPANY (nome),
data: NUMBER OF BRANCHS
}, {
name: NAME OF COMPANY (nome),
data: NUMBER OF BRANCHS
}]
How I do this convertion? Thanks
This will return a json object with only one result.
If we use previous example, can be done like this:
$arr = $this->Company->find('all'); // fetch the array
$arr1 = array();
foreach ($arr as $value) {
$tmp = array();
$tmp['name'] = $value['Company']['nome'];
$tmp['data'] = count($value['Branch']);
$arr1[] = $tmp;
}
return json_encode($arr1);
<?php
$sql=mysql_query("select * from Posts limit 20");
$response = array();
$posts = array();
while($row=mysql_fetch_array($sql))
{
$title=$row['title'];
$url=$row['url'];
$posts[] = array('title'=> $title, 'url'=> $url);
}
$response['posts'] = $posts;
$fp = fopen('results.json', 'w');
fwrite($fp, json_encode($response));
fclose($fp);
?>
This will generate a file called results.json file where your php file is stored on your online server, taking url and title variables from your MySQL db, you can change the variable names to what you want to fetch.
The whole idea is about like this
$arr=$this->Company->find('all'); // fetch the array
$arr1=array();
foreach ($arr as $value) {
$arr1['name']=$value['Company']['nome'];
//some more manual transform to desire format
}
return json_encode($arr1);

Should the following join structure work for a CakePHP find?

Is the following join structure correctly formatted to work with a CakePHP find? This doesn't seem to be working when I use it along with conditions and my gut tells me that the structure is off. I'm new to joins, so any help is appreciated.
'joins' => array(
(int) 0 => array(
'table' => 'cheeses_milk_sources',
'alias' => 'CheesesMilkSource',
'type' => 'INNER',
'conditions' => array(
(int) 0 => 'Cheese.id = CheesesMilkSource.cheese_id'
)
),
(int) 1 => array(
'table' => 'milk_sources',
'alias' => 'MilkSource',
'type' => 'INNER',
'conditions' => array(
(int) 0 => 'CheesesMilkSource.milk_source_id = MilkSource.id',
'CheesesMilkSource.milk_source_id' => '1'
)
)
),
'conditions' => array(
'AND' => array(
(int) 0 => array(
'Cheese.cheese_producer_id' => (int) 35
),
(int) 1 => array(
'Cheese.active' => (int) 1
)
)
),
The confusing part is
'conditions' => array(
(int) 0 => 'CheesesMilkSource.milk_source_id = MilkSource.id',
'CheesesMilkSource.milk_source_id' => '1'
)
You are mixing an array element without a key with one with a key equal to CheesesMilkSource.milk_source_id.
if you need to specify two conditions on the join, do it like
'conditions' => array(
'CheesesMilkSource.milk_source_id = MilkSource.id AND CheesesMilkSource.milk_source_id = 1'
)
perhaps the next snippet will equally work, but I'm not sure and can't test it at the moment - let me know if it does with a comment.
'conditions' => array(
'CheesesMilkSource.milk_source_id = MilkSource.id',
'CheesesMilkSource.milk_source_id = 1'
)
But since you're joining the tables, maybe you should put CheesesMilkSource.milk_source_id = 1 in the general conditions of the find:
'conditions' => array(
'Cheese.cheese_producer_id' => 35,
'Cheese.active' => 1,
'CheesesMilkSource.milk_source_id' => 1,
)
Notice you don't need to specify AND as this is the default way of joining conditions.