Laravel 5:in_array() 期望参数 2 是数组,给定对象

Posted

技术标签:

【中文标题】Laravel 5:in_array() 期望参数 2 是数组,给定对象【英文标题】:Laravel 5: in_array() expects parameter 2 to be array, object given 【发布时间】:2015-12-17 09:30:48 【问题描述】:

我正在尝试将一个包含登录用户对帖子的投票的数组从控制器传递到视图,但我不断收到此错误

in_array() 期望参数 2 是数组,给定对象(查看: C:\xampp\htdocs\laravel-5\resources\views\subreddit\show.blade.php)

我尝试使用lists(),但我得到了这个错误而不是Missing argument 1 for Illuminate\Database\Eloquent\Builder::lists()

使用lists('post_id') 在标题中返回相同的错误。

控制器

public function show(Subreddit $subreddit)

    $posts = Subreddit::findOrFail($subreddit->id)->posts()->get();
    $votes = Auth::user()->votes()->get(); //I have also tried lists()

    return view('subreddit/show')
        ->with('subreddit', $subreddit)
        ->with('posts', $posts)
        ->with('votes', $votes);

查看

@foreach($posts as $post)
    @if ($voted = in_array($post->id, $votes))
      !! Form::open(['url' => 'votes', 'class' => 'votes']) !!
    @endif
      <div class="upvote topic" data-post=" $post->id ">
         <a class="upvote vote  $voted ? 'voted-on' : '' " data-value="1"></a>
         <span class="count">0</span>
         <a class="downvote vote  $voted ? 'downvoted-on' : '' " data-value="-1"></a>
      </div>
    !! Form::close() !!

【问题讨论】:

仅供参考,您可以将 Auth::user()-&gt;votes()-&gt;get() 更改为 Auth::user()-&gt;votesSubreddit::findOrFail($subreddit-&gt;id)-&gt;posts()-&gt;get() 更改为 Subreddit::findOrFail($subreddit-&gt;id)-&gt;posts 【参考方案1】:

您需要将您的集合转换为数组。只需将 toArray() 附加到您的查询中,如下所示,因为 'toArray()' 会将集合转换为普通的 PHP 数组:

 $votes = Auth::user()->votes()->get()->toArray(); 

希望对您有所帮助。

【讨论】:

这给了我Call to undefined method Illuminate\Database\Eloquent\Collection::to_array(),尽管我在顶部添加了use Illuminate\Database\Eloquent\Collection toarray()没有下划线吗? 哎呀,这是 toArray() 不是 to_array(),更正了我的答案 谢谢你,成功了。请更新您的答案,以便我选择它作为正确的答案。 @ajameswolf 你能详细说明一下吗? 所以您只使用一列,我认为这就是您使用列表命令的原因。这可以通过更少的步骤和更简洁的代码来实现: $posts = Subreddit::findOrFail($subreddit->id)->posts()->select('post_id')->get();未经测试,但应该可以工作。【参考方案2】:

您可以使用toArray() 方法将集合转换为其他建议的数组。但我宁愿改变

in_array($post->id, $votes)

$votes->contains($post->id)

更新

上述方法仅适用于 $votes 是 ID 的集合。例如。当你使用

$votes = Auth::user()->votes()->pluck('post_id');

但是,您需要使用当前的控制器代码

$votes->contains('post_id', $post->id);

因为$votesVote 对象的集合,您只想在post_id 列/属性中进行搜索。

【讨论】:

@if($votes-&gt;contains('votes_column_id', $post-&gt;id)) 感谢您的建议。对我来说,它只能通过输入列的名称来工作。【参考方案3】:

我认为 pluck 会解决你的问题。

$voteIds = Auth::user()->votes()->get()->pluck('id')->toArray();

【讨论】:

谢谢,@Suren 你节省了我的时间

以上是关于Laravel 5:in_array() 期望参数 2 是数组,给定对象的主要内容,如果未能解决你的问题,请参考以下文章

strpos() 期望参数 1 是字符串,对象给定 laravel 5.5

Laravel in_array 验证规则

htmlspecialchars() 期望参数 1 是字符串,给定对象 - laravel

Laravel - htmlspecialchars() 期望参数 1 是字符串,给定对象

Laravel - strtolower() 期望参数 1 是字符串,给定对象

Laravel 6 pathinfo() 期望参数 1 是字符串,给定对象