我正在laravel 5.3中开发一个Web应用程序。我得到的问题是属性不会在stdClass对象中累加,但是你可以看到我在代码中明确设置/在对象中添加新属性的代码。
有问题的代码
$('input[type=text]').each(
function(index)
{
console.log(' text: ' + $(this).val() + ' replace: ' + $(this).val().replace( new RegExp("(file\:\/\/test)","gm"),"/test.abc.local") );
}
);
在上面的代码中,您可以清楚地看到我正在为1- $sender = Sender::where('id', $this->senderId)->first();
2- if ($sender != null) {
3- var_dump($sender->bundle);
4- $sender->bundle->latitude = $this->lat;
5- $sender->bundle->longitude = $this->long;
6- $sender->bundle->location = $response->formattedAddress();
7- var_dump($sender->bundle);
8- $sender->save();
9- error_log('resolved');
10- } else {
11- error_log('no sender');
12- }
对象设置一些新属性。
bundle
但是在输出中你可以清楚地看到它没有加起来。代码基本上在laravel队列中运行。在上面的代码中,$sender->bundle->latitude = $this->lat;
$sender->bundle->longitude = $this->long;
$sender->bundle->location = $response->formattedAddress();
是laravel eloquent模型,属性包通过laravel mutators进行$sender
。
mutator code
json_decode
输出上述有问题的代码
public function setBundleAttribute($value) {
$this->attributes['bundle'] = json_encode($value);
}
public function getBundleAttribute($value) {
return json_decode($value);
}
解决了问题
laravel 访问者&突变者导致问题。
每当我们分别得到或设置属性时,就会调用Accessor和Mutator,在我的情况下,每当我尝试访问object(stdClass)#686 (3) { #output of line 3
["city"]=>
string(0) ""
["province"]=>
string(0) ""
["country"]=>
string(0) ""
}
object(stdClass)#686 (3) { #output of line 7
["city"]=>
string(0) ""
["province"]=>
string(0) ""
["country"]=>
string(0) ""
}
[2017-07-25 16:11:03] Processed: App\Jobs\LocationResolverQueue
resolved
时,mutator都会调用,但是因为我设置的是$sender->bundle->property
而不是{ {1}}
我解决了像
$sender->bundle->property