Love Fuel?
Donate
About
Forums
Discussions
Login
About
Forums
Discussions
Login
FuelPHP Forums
Ask your question about FuelPHP in the appropriate forum, or help others by answering their questions.
Orm
Observer_Typing ignores selected fields
rrlledo
November 2018
I have this model:
class Model_Philhealth extends Orm\Model
{
protected static $_table_name = 'philhealth_contribution';
//
protected static $_properties = array(
//
'id',
//
'SalaryRange_From', 'SalaryRange_To'
//
);
protected static $_observers = array(
// This typing should be modified to format and return only the specified fields!
'Orm\\Observer_Typing'
);
/**
*
@param
$monthlyBasicPay
*
@param
int $year date('Y')
*
@return
bool|array
*/
public static function getShare($monthlyBasicPay, $year = 2014)
{
// query() doesn't support column alias
$share = static::query()
->select('EmployeeShare', 'EmployerShare', 'SalaryBase')
->where('year', $year)
->where('SalaryRange_From', '<=', $monthlyBasicPay) // $monthlyBasicPay >= SalaryRange_From
->where('SalaryRange_To', '>=', $monthlyBasicPay) // $monthlyBasicPay <= SalaryRange_To
->get_one()
->to_array()
;
print_r($share);die;
// % - get from phic
$premiumRate = 2.5;
$share['Employee'] = ($share['SalaryBase'] * ($premiumRate / 100) / 2);
$share['Employer'] = ($share['SalaryBase'] * ($premiumRate / 100) / 2);
unset($share['SalaryBase']);
unset($share['EmployeeShare']);
unset($share['EmployerShare']);
return $share;
}
}
The result of print_r:
Array
(
[id] => 13
[SalaryBase] => 20000
[EmployeeShare] => 250
[EmployerShare] => 250
[philhealth_id] =>
[year] =>
[SalaryBracket] =>
[SalaryRange_From] =>
[SalaryRange_To] =>
[TotalMonthlyPremium] =>
)
If I disable Observer_Typing, it returns only the selected fields:
Array
(
[id] => 13
[SalaryBase] => 20000.00
[EmployeeShare] => 250.00
[EmployerShare] => 250.00
)
My question is, should it be that even if Observer_Typing is enabled or applied, it should only return the selected fields?
rrlledo
November 2018
Here is what I did:
In fuel\packages\orm\classes\model.php
public function __unset($property)
{
if (array_key_exists($property, static::properties()))
{
//
$this->_data[$property] = null;
unset($this->_data[$property]);
}
elseif ($rel = static::relations($property))
{
$this->_reset_relations[$property] = true;
$this->_data_relations[$property] = $rel->singular ? null : array();
}
elseif ($this->_get_eav($property, true, true))
{
// no additional work needed here
}
elseif (array_key_exists($property, $this->_custom_data))
{
unset($this->_custom_data[$property]);
}
}
I replaced the line:
$this->_data[$property] = null;
with:
unset($this->_data[$property]);
In the model:
protected static $_observers = array(
// This typing should be modified to format and return only the specified fields!
'Orm\\Observer_Typing',
'formatResult' => array(
'events' => array('after_load')
)
);
then the formatResult:
class formatResult
{
// it may have many methods and properties before or after the orm_notify method
public static function orm_notify($instance, $event)
{
$select = array('EmployeeShare', 'EmployerShare', 'SalaryBase');
foreach ($instance->properties() as $key => $value) {
if (!in_array($key, $select)) {
unset($instance->$key);
}
}
}
}
The print_r result:
Array
(
[SalaryBase] => 20000
[EmployeeShare] => 250
[EmployerShare] => 250
)
rrlledo
November 2018
Or this:
In fuel\packages\orm\classes\model.php
public function __unset($property)
{
if (array_key_exists($property, static::properties()))
{
//
$this->_data[$property] = null;
unset($this->_data[$property]);
}
elseif ($rel = static::relations($property))
{
$this->_reset_relations[$property] = true;
$this->_data_relations[$property] = $rel->singular ? null : array();
}
elseif ($this->_get_eav($property, true, true))
{
// no additional work needed here
}
elseif (array_key_exists($property, $this->_custom_data))
{
unset($this->_custom_data[$property]);
}
}
In model:
protected static $_observers = array(
// This typing should be modified to format and return only the specified fields!
'Orm\\Observer_Typing',
// 'formatResult' => array(
// 'events' => array('after_load')
// )
);
public static function getShare($monthlyBasicPay, $year = 2014)
{
// query() doesn't support column alias
$share = static::query()
->select('EmployeeShare', 'EmployerShare', 'SalaryBase')
->where('year', $year)
->where('SalaryRange_From', '<=', $monthlyBasicPay) // $monthlyBasicPay >= SalaryRange_From
->where('SalaryRange_To', '>=', $monthlyBasicPay) // $monthlyBasicPay <= SalaryRange_To
->get_one()
// ->to_array()
;
// % - get from phic
$premiumRate = 2.5;
$share['Employee'] = ($share['SalaryBase'] * ($premiumRate / 100) / 2);
$share['Employer'] = ($share['SalaryBase'] * ($premiumRate / 100) / 2);
$select = array('EmployeeShare', 'EmployerShare', 'SalaryBase');
foreach ($share as $key => $value) {
if (!in_array($key, $select)) {
unset($share[$key]);
}
}
return $share;
}
WanWizard
November 2018
Accepted Answer
See my answer to your other question.
The ORM doesn't support making a sub-selection of columns, it interferes with the mapping part of ORM.
However, this being Fuel you can if you want to, but you have to know it's restrictions and side-effects, one of them you encounter here...
rrlledo
November 2018
Thanks.
Add a Comment
Howdy, Stranger!
It looks like you're new here. If you want to get involved, click one of these buttons!
Sign In
Apply for Membership
Categories
All Discussions
5,090
General
↳ General
3,364
↳ Job Board
13
↳ Installation & Setup
214
Packages
↳ Oil
213
↳ Orm
700
↳ Auth
262
Development
↳ Tips and Tutorials
126
↳ Code share
145
↳ Applications
52
In this Discussion
rrlledo
November 2018
WanWizard
November 2018
To Top