Magento 2:以不同方式获取集合的字段


8

我在Magento 2中有这个辅助课程:

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    protected $_countryFactory;

    public function __construct(
         \Magento\Directory\Model\CountryFactory $countryFactory
    )
    {
         $this->_countryFactory = $countryFactory;
    }

    public function getCountryIsoCode($country = 'US')
    {
          $country = $this->_countryFactory->create()->getCollection();
          $country->addFieldToFilter('country_id', array('eq' => country));

          $countryCode = $country->getFirstItem()->getIso3Code());
          $countryCode2 = $country->getFirstItem()->getData('iso3_code'));

          // $countryCode => null
          // $countryCode2 => 'USA'

          return $countryCode;
     }
}

函数getCountryIsoCode()有一个示例作为参数('US')。
我不为什么getIso3Code()不起作用。相反,getData()可以完美地工作。

在Magento2中,不再有“获取数据库表字段的php魔术功能”了吗?
我的代码有问题吗?

Answers:


7

问题出3在名字上。
我刚刚测试过,魔术吸气剂不能很好地与名称中的数字配合使用。
该方法getIso3Code不存在,因此,将__call调用在中定义的方法Magento\Framework\DataObject
get部分看起来像这样。

$key = $this->_underscore(substr($method, 3));
$index = isset($args[0]) ? $args[0] : null;
return $this->getData($key, $index);

_underscore变换方法的名称为所需的数据键。
这是重要的一行。

$result = strtolower(trim(preg_replace('/([A-Z]|[0-9]+)/', "_$1", $name), '_'));

我只是在http://phpfiddle.org/上运行了这段代码:

$name = 'iso3_code';
echo strtolower(trim(preg_replace('/([A-Z]|[0-9]+)/', "_$1", $name), '_'));

让我感到惊讶的是它显示了iso_3_code但你期望了iso3_code


这次我打败了你:-)
拉杰夫·托米

2
是的 辛苦了 我已经+1了你的答案。
马里斯(Marius)

9

没有Magento 2也使用获取/设置魔术方法。如果您想看那些魔术。请尝试以下方法:

$countryId = $country->getFirstItem()->getCountryId();
echo $countryId;

这将country_id根据您的代码输出第一个对象的值。

因此,现在的问题是电话会议发生了什么getIso3Code()。好吧,这是一个转折。Magento的魔术获取者会将此调用解释iso_3_code为显然是未定义的,因此您得到null结果。

Magento之所以以这种方式处理此调用,是因为它在preg_replace()内部使用方法从我们正在使用的魔术获取器中检索实际代码。这意味着,当您调用时getCountryId(),Magento具有内部逻辑,该逻辑将找出您要查找的真实代码country_id。如果getIso3Code()由于该数字的出现,相同的内部逻辑将失败3

因此,在这种特殊情况下,最好使用getData('iso3_code')call。

希望能给您清晰的画面。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.