问题描述
在这里,我不得不使用isset()
,即使变量中有值,它也会返回false
。我的PHP
版本是这样:
PHP 7.0.33-14+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Dec 18 2019 14:55:39) ( NTS )
copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0,copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.33-14+ubuntu18.04.1+deb.sury.org+1,copyright (c) 1999-2017,by Zend Technologies
with Xdebug v2.6.1,copyright (c) 2002-2018,by Derick Rethans
我的laravel
版本是这样:
"laravel/framework": "5.5.28",
这是其中包含isset()
的一段代码:
return isset($this->pivot->factor) ? $this->pivot->factor : $this->getFactor();
现在,如果我这样做:
\Log::debug('$this->pivot->factor',[$this->pivot->factor]);
变量$this->pivot->factor
中的值是11
,这是正确的,但是如果我执行dd(isset($this->pivot->factor));
,它将返回false
。这里发生了什么?该如何解决?
编辑 这是方法:
public function getLinkedFactor()
{
if ($this->priceResponce) {
$rateAdditionals = $this->priceResponce->rate->additionals;
$rateAdditional = $rateAdditionals->filter(function ($item) {
return $item->id == $this->id;
})->first();
if ($rateAdditional && $rateAdditional->pivot->factor) {
return $rateAdditional->pivot->factor;
}
}
\Log::debug('$this->pivot->factor',[$this->pivot->factor]);
return isset($this->pivot->factor) ? $this->pivot->factor : $this->getFactor();
}
这是访问该代码的测试:
/**
* @test
*/
public function shouldConsiderLinkedFactor()
{
$officeAttrs = [
'id' => 1,'additional_id' => 2,'office_id' => 3,'factor' => 11
];
$officeAdditional = $this->makeEloquentMock(OfficeAdditional::class,$officeAttrs);
$officeAdditional->shouldReceive('hasGetMutator')->andReturn(true);
$officeAdditional->shouldReceive('getAttributeValue')->andReturn($officeAttrs['factor']);
$officeAdditional->shouldReceive('toJson');
$attributes = [
'additional_type_id' => 2,'factor' => 10,'name' => 'test fixed additional','description' => 'asdasdasd','has_input' => false,'kind' => 'linked','input_label' => '','carrier_facing_cost' => 1,'min' => 5,'max' => 10
];
$additional = Additional::make($attributes);
$additional->pivot = $officeAdditional;
$this->assertEquals($officeAttrs['factor'],$additional->getLinkedFactor());
}
解决方法
我发现这种情况下的解决方法是这样的。我替换了这一行:
return isset($this->pivot->factor) ? $this->pivot->factor : $this->getFactor();
与此:
return $this->pivot === null ? $this->getFactor() : $this->pivot->factor === null ? $this->getFactor() : $this->pivot->factor;
这样,我不必使用isset()
。
我没有50分可以加入上面的评论,所以我希望这是一个足够的答案。 https://laravel.com/docs/7.x/eloquent-resources#conditional-relationships
更新:将getLinkedFactor的最后一行替换为
eg. const user = require('../model/user');