【问题标题】:How to remove brackets and quote when displaying array results - Laravel显示数组结果时如何去除括号和引号 - Laravel
【发布时间】:2017-08-12 01:24:14
【问题描述】:

我是 Laravel 的新手,正在做我的第一个项目。我遇到的一个小问题是,当我构建一个集合(数组)并将结果插入 Laravel Form Select 并导出到 Excel 时,我的结果包含在 ["array"] 括号和引号中。

构建集合的代码:

                   $p3 = DB::table('players')
                       ->where ('id', $player3)
                       ->selectRaw('id, CONCAT(fname," ",lname) as full_name')
                       ->pluck('full_name', 'id');

                   $played['p'] .= $p3;

                   $p4 = DB::table('players')
                       ->where ('id', $player4)
                       ->selectRaw('id, CONCAT(fname," ",lname) as full_name')
                       ->pluck('full_name', 'id');

注意,上面有 16 个(从关联表中获取名称)...然后我构建集合:

$played = collect([$p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8, $p9, $p10, $p11, $p12, $p13, $p14, $p15, $p16]);

并传递给视图:

return view('grades.matchcard.edit', compact('data','data1', 'played', 'mid'));

根据图片,结果用括号/引号括起来......当我导出到 Excel 时也是如此......我尝试了 join & implode(得到错误)。尝试使用

str_replace(有点工作 - 但不是很好......

任何建议将不胜感激。谢谢

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    您的每个数据库查询都会生成一个包含一个元素的集合,然后您将这些集合收集到最终的 $played 变量中。所以迭代它,每个项目实际上是另一个集合。你想flatten 收藏,像这样:

    $played = collect([$p1, $p2, ...])->flatten();
    

    顺便说一句,我没有看到您的其余代码,但是您显示的代码块效率很低,可能写得更好:

    $played = DB::table('players')
    ->whereIn('id', [$player3, $player4, $player5 .... all your ids ...])
    ->selectRaw('id, CONCAT(fname," ",lname) as full_name')
    ->pluck('full_name', 'id');
    

    这里你只做一个数据库查询,而不是很多,查询返回你的集合,不需要进一步收集和展平。 More info in the docs.

    UPDATE 根据 cmets 进行澄清:

    上面的pluck() 方法通过第二个参数键入结果集合。所以$played 应该是正确匹配的id => full_name 元素的集合。要显示 id 3 的播放器的全名,您应该可以使用$played[3]

    顺便说一句:你有Player 模型吗?如果没有,请按照您可能应该的整洁的 Laravel 方式做事,这会使事情变得更简单。例如:

    在您的模型中

    定义一个访问器,以便更轻松地获取全名。

    public function getFullNameAttribute($value) {
        return $value->fname . ' ' . $value->lname;
    }
    

    More info about accessors 在文档中。

    在您的控制器中

    $players = App\Player::find([$player3, $player4, $player5 .... all your ids ...]);
    return view('whatever.your.view.is', ['players' => $players]);
    

    More info about retrieving models 在文档中。

    在你看来

    <select>
    @foreach ($players as $player)        
        <option value='{{ $player->id }}'>{{ $player->full_name }}</option>
    </select>
    @endforeach
    

    如果您希望以特定顺序列出玩家,您应该在模型/数据库中定义该顺序(例如,players.ranking 字段?),或者,如果该顺序基于可派生的东西,您可以对其进行排序在飞行中。例如,如果您需要它们按字母顺序排列,您可以将 -&gt;orderBy('lname') 添加到控制器中的 $players 查询中。

    【讨论】:

    • 糟糕,我刚刚注意到 [$p1, ... ] 数组放错了位置,已修复。这是否为您解决了问题?
    • 谢谢不要惊慌...快到了... $played=collect([$player])->flatten(); (在您修改后的单个查询之后)唯一的问题是玩家按特定顺序排列(因此,$p1,$p2 到 $p16)。当我根据顺序查询数组时(例如,刀片中的 {{ $played[1] }} 应该返回 $p2 full_name - 它不是 - 它以不同的顺序显示名称)。此外,“ID”不是数组的一部分——只是全名——我需要稍后返回该 ID。希望这有意义吗?对不起,我在这里的有限经验 - 它可能非常简单......再次感谢!
    • @Jimmy 听起来您的问题比您最初提到的要多!我发布的pluck 代码将为您提供 ID,正确映射到正确的名称......如果您没有看到它,那么还有其他东西妨碍您。我更新了我的答案,并添加了关于如何以正确的 Laravel 方式执行此操作的描述。
    • 非常感谢@Don't Panic...巨大的帮助....从根本上说,这一切都很好。我目前唯一的问题是数组结果的顺序(这在技术上不是我最初问题的一部分)。我正在研究,有些人提到了我玩弄的 orderByRaw(FIELD(.... 类型子句-但除此之外,您已经解决了我的主要问题-再次感谢!!
    • 再次感谢...对不起堆栈上的第一个 Q - 不知道我必须这样做:) - 全部完成
    【解决方案2】:

    试试

    $p4 = DB::table('players')
    ->where ('id', $player4)
    ->selectRaw('id, CONCAT(fname," ",lname) as full_name')
    ->get();
    

    在刀片中

    {{$p4->id}}
    {{$p4->full_name}}
    

    编辑

    对不起,我没有看到洞的问题

    你可以这样做

    $p4 = DB::table('players')
       ->where ('id', $player4)
       ->selectRaw('id, CONCAT(fname," ",lname) as full_name')
       ->get();
    
    $played = new Collection();
    $played.push($p4);
    

    在刀片中这应该可以工作

    @foreach($played as $object)
        {{$object->id}}
        {{$object->full_name}}
    @endforeach
    

    【讨论】:

    • 我同意@Leonardo。您将 $p4 变量(一个数组)插入另一个数组,并将其分配给 $played。因此,您在访问该值时会遇到麻烦,因为它是两个数组深。
    • 感谢莱昂纳多 - 它的工作!我唯一的问题(1。我希望不要恐慌单个查询而不是 16),并且我无法让 FULL 数组显示在 Form::Select 中,默认值为当前值。我正在努力实现:{!! Form::select('capt', $played, $played[0], ['class' => 'form-control']) !!} 我在下拉列表中列出所有名称,默认为当前 $played [0] 在这种情况下,下一个选择将是 $played[1] 等等。我没有使用 foreach - 只是试图传递 FULL 列表和 16 个选择中的每一个的当前值。这有意义吗?
    猜你喜欢
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2011-11-15
    • 2017-09-24
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多