2016-11-13 75 views
0

我想一个数组转换为一个集合,映射了它。但是我收到一个错误:Laravel收集工作不

ErrorException in Poll.php line 90: 
Undefined index: id 

代码:

$options = collect($options); 
$options->map(function($option) { 
    if($this->options->contains('id', $option['id'])) { //line 90 
     Option::create($option); 
    } 
}); 

当我dd($options);它看起来像这样:

Collection {#390 
    #items: array:4 [ 
    0 => array:7 [ 
     "id" => 17 
     "slug" => "asdf-1" 
     "name" => "asdf" 
     "poll_id" => 6 
     "created_at" => "2016-11-13 17:39:01" 
     "updated_at" => "2016-11-13 17:39:01" 
     "votes" => [] 
    ] 
    1 => array:7 [ 
     "id" => 18 
     "slug" => "asdfkowugiw" 
     "name" => "asdfkowugiw" 
     "poll_id" => 6 
     "created_at" => "2016-11-13 17:39:01" 
     "updated_at" => "2016-11-13 17:39:01" 
     "votes" => [] 
    ] 
    2 => array:7 [ 
     "id" => 21 
     "slug" => "asdf-1" 
     "name" => "asdf" 
     "poll_id" => 6 
     "created_at" => "2016-11-13 17:48:37" 
     "updated_at" => "2016-11-13 17:48:37" 
     "votes" => [] 
    ] 
    3 => array:7 [ 
     "id" => 22 
     "slug" => "asdfkowugiw" 
     "name" => "asdfkowugiw" 
     "poll_id" => 6 
     "created_at" => "2016-11-13 17:48:37" 
     "updated_at" => "2016-11-13 17:48:37" 
     "votes" => [] 
    ] 
    ] 
} 

所以这是一个集合,所以我应该能够做到这一点对不对?:

$options = collect($options); 
$options->map(function($option) { 
    if($this->options->contains('id', $option->id)) { 
     Option::create($option); 
    } 
}); 

但这失败了。这里有什么问题?

- 编辑 -

array:7 [ 
    "id" => 17 
    "slug" => "asdf-1" 
    "name" => "asdf" 
    "poll_id" => 6 
    "created_at" => "2016-11-13 17:39:01" 
    "updated_at" => "2016-11-13 17:39:01" 
    "votes" => [] 
] 

回答

1

你应该使用箭头,其目的在于这样的访问ID:

$options = collect($options); 
$options->map(function($option) { 
    if($this->options->contains('id', $option->id)) { //line 90 
     Option::create($option); 
    } 
}); 

希望这有助于!

+0

这是我收到的问题:'''试图让非object''' – Jamie

+0

财产尝试打印$选项里面什么? –

+0

请参阅我的编辑。 – Jamie

1

正如@Saumya Rastogi指出的那样,我也怀疑,这个问题从$options数据出来。一些项目可能没有id键。所以希望用简单的检查与isset()的伎俩(或者,如果你想在Laravel方式,您可以使用array_has())。

$options = collect($options); 

$options->map(function ($option) { 
    // Make sure that "id" key is exsits. 
    if (isset($option['id']) && $this->options->contains('id', $option['id'])) { 
     Option::create($option); 
    } 
}); 

希望得到这个帮助!

+0

嗨,谢谢帮助。它看起来像'''$ option ['id'];'''不是空的。但是它不能在'''$ this-> options-> contains('id',$ option ['id'])中被访问''' – Jamie

0

我觉得$this上下文是遥不可及的这种情况。您可以尝试设置它传递明确地,像这样:

$options = collect($options); 
$opts = $this->options; 
$options->map(function($option) use ($opts) { 
    if($opts->contains('id', $option->id)) { 
    Option::create($option); 
    } 
});