Как использовать красноречивое "С", чтобы передать массив из нескольких массивов для циклирования

Как использовать красноречивое "С", чтобы передать массив из нескольких массивов для циклирования

17.01.2020 01:10:47 Просмотров 34 Источник

Я пытаюсь создать страницу, которая имеет разные uls для разных отфильтрованных строк в одной таблице SQL. Я пытался и искал в течение последних нескольких часов, чтобы увидеть, как я мог бы предоставить представление с несколькими массивами, используя "with", я собираюсь сразу же опубликовать код, чтобы он мог дать лучшее представление о том, что я пытаюсь сделать. Поскольку каждый массив использует разные параметры SQL, я не был уверен, как собрать их все в одну переменную, поэтому я решил передать его как массив

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Activity;

class ActivityController extends Controller
{
    public function index (){
        $activities[] = [
            'yearlies' => Activity::all()
                ->where('activity_feature_type', 'yearly')
                ->sortByDesc('activity_daily_budget')
                ->take(6),
            'monthlies' => Activity::all()
                ->where('activity_feature_type', 'monthly')
                ->sortByDesc('activity_daily_budget')
                ->take(4),
            'weeklies' => Activity::all()
                ->where('activity_feature_type', 'weekly')
                ->sortByDesc('activity_daily_budget')
                ->take(4),
        ];
        return view('activities')->with('activities', $activities);
    }
}

На стороне клиента я хочу сделать цикл через каждую переменную, чтобы поместить их в каждый UL

<div class="row pt-2">
            @if(count($yearlies) > 0)
                @foreach($activities['yearlies'] as $yearly)
                    <div class="col-sm-2">
                        <div class="card" style="width: 18rem;">
                            <img class="card-img-top" src="img/{{$yearly->activity_picture_link}}" alt="Card image cap">
                            <div class="card-body">
                                <h5 class="card-title">{{$yearly->name}}</h5>
                                <p class="card-text">{{$yearly->activity_desc_short}}</p>
                            </div>
                            <ul class="list-group list-group-flush">
                                @if ($yearly->activity_free === true)
                                    <li class="list-group-item"><h6 class="font-weight-bold">Free</h6></li>
                                @else
                                    <li class="list-group-item"><h6 class="font-weight-bold">${{$yearly->activity_low_cost}} - ${{$yearly->activity_high_cost}}</h6></li>
                                @endif
                            </ul>
                            <div class="card-body">
                                <a href="/activities/{{$yearly->id}}" class="card-link">View Activity</a>
                                <a href="/" class="card-link float-right">Save</a>
                            </div>
                        </div>
                    </div>
                @endforeach
            @else
                <h5 class="text-secondary text-center">No yearlies available</h5>
            @endif
        </div>

Надеюсь, это в какой-то степени очевидно, что я пытаюсь сделать. Несмотря на это, я искал, и все, что я вижу, - это материал о коллекциях, но я лично не определяю различные подценности, поэтому я не могу использовать функциональность=>, которую они делают. Любая помощь ценится.

EDIT: Ниже приведен dd $ activities, я хотел бы знать, как перейти к каждой строке yearlies через это

array:1 [▼
  0 => array:3 [▼
    "yearlies" => Illuminate\Database\Eloquent\Collection {#262 ▼
      #items: array:1 [▼
        0 => App\Activity {#295 ▼
          #table: "activities"
          #connection: "mysql"
          #primaryKey: "id"
          #keyType: "int"
          +incrementing: true
          #with: []
          #withCount: []
          #perPage: 15
          +exists: true
          +wasRecentlyCreated: false
          #attributes: array:14 [▼
            "id" => 1
            "name" => "name"
            "activity_desc_short" => "desc"
            "activity_desc" => "desc"
            "activity_free" => 0
            "activity_low_cost" => "10.50"
            "activity_high_cost" => "20.50"
            "activity_feature_type" => "yearly"
            "activity_daily_budget" => "3.00"
            "activity_picture_link" => null
            "activity_posting_business" => ""
            "location" => null
            "created_at" => "2020-01-16 21:22:18"
            "updated_at" => "2020-01-16 21:22:18"
          ]
          #original: array:14 [▶]
          #changes: []
          #casts: []
          #dates: []
          #dateFormat: null
          #appends: []
          #dispatchesEvents: []
          #observables: []
          #relations: []
          #touches: []
          +timestamps: true
          #hidden: []
          #visible: []
          #fillable: []
          #guarded: array:1 [▶]
        }
      ]
    }
    "monthlies" => Illuminate\Database\Eloquent\Collection {#288 ▶}
    "weeklies" => Illuminate\Database\Eloquent\Collection {#298 ▶}
  ]
]
У вопроса есть решение - Посмотреть?

Ответы - Как использовать красноречивое "С", чтобы передать массив из нескольких массивов для циклирования / How to use eloquent "with" to pass array of multiple arrays for looping

amr degheidy

17.01.2020 01:24:46

div class="row pt-2">
            @if(count($yearlies) > 0)
                @foreach($activities->yearlies as $yearly)
                    <div class="col-sm-2">
                        <div class="card" style="width: 18rem;">
                            <img class="card-img-top" src="img/{{$yearly->activity_picture_link}}" alt="Card image cap">
                            <div class="card-body">
                                <h5 class="card-title">{{$yearly->name}}</h5>
                                <p class="card-text">{{$yearly->activity_desc_short}}</p>
                            </div>
                            <ul class="list-group list-group-flush">
                                @if ($yearly->activity_free === true)
                                    <li class="list-group-item"><h6 class="font-weight-bold">Free</h6></li>
                                @else
                                    <li class="list-group-item"><h6 class="font-weight-bold">${{$yearly->activity_low_cost}} - ${{$yearly->activity_high_cost}}</h6></li>
                                @endif
                            </ul>
                            <div class="card-body">
                                <a href="/activities/{{$yearly->id}}" class="card-link">View Activity</a>
                                <a href="/" class="card-link float-right">Save</a>
                            </div>
                        </div>
                    </div>
                @endforeach
            @else
                <h5 class="text-secondary text-center">No yearlies available</h5>
            @endif
        </div>

попробовать это

https://stackoverflow.com/questions/59778565/how-to-use-eloquent-with-to-pass-array-of-multiple-arrays-for-looping/59778706#comment105701620_59778706
Это возвращает "попытка получить свойство 'yearlies' не-объекта"
Является ответом!
Saurabh Gupte

17.01.2020 01:36:49

Поскольку вы посылаете значение в одну переменную массива, это означает, что это многомерный массив.

Кроме того, вместо того, чтобы

$activities[] = [
            'yearlies' => Activity::all()
                ->where('activity_feature_type', 'yearly')
                ->sortByDesc('activity_daily_budget')
                ->take(6),
            'monthlies' => Activity::all()
                ->where('activity_feature_type', 'monthly')
                ->sortByDesc('activity_daily_budget')
                ->take(4),
            'weeklies' => Activity::all()
                ->where('activity_feature_type', 'weekly')
                ->sortByDesc('activity_daily_budget')
                ->take(4),
        ];

Воспользуйся

$activities = [
            'yearlies' => Activity::all()
                ->where('activity_feature_type', 'yearly')
                ->sortByDesc('activity_daily_budget')
                ->take(6),
            'monthlies' => Activity::all()
                ->where('activity_feature_type', 'monthly')
                ->sortByDesc('activity_daily_budget')
                ->take(4),
            'weeklies' => Activity::all()
                ->where('activity_feature_type', 'weekly')
                ->sortByDesc('activity_daily_budget')
                ->take(4),
        ];

что уменьшит сложность массива.

Кроме того, в вашем blade

Думаю, это сработает отлично. Если я ошибаюсь, пожалуйста, поправьте меня. Надеюсь, это сработает для вас.

https://stackoverflow.com/questions/59778565/how-to-use-eloquent-with-to-pass-array-of-multiple-arrays-for-looping/59778821#comment105701834_59778821
Это вернуло ошибку; count (): параметр должен быть массивом или объектом, реализующим Счетный
https://stackoverflow.com/questions/59778565/how-to-use-eloquent-with-to-pass-array-of-multiple-arrays-for-looping/59778821#comment105701856_59778821
Тогда вместо countнепосредственно использовать его. Я отредактирую свой ответ. Вы можете попробовать это.
https://stackoverflow.com/questions/59778565/how-to-use-eloquent-with-to-pass-array-of-multiple-arrays-for-looping/59778821#comment105701958_59778821
Большое вам спасибо, он работает, как и было задумано!
https://stackoverflow.com/questions/59778565/how-to-use-eloquent-with-to-pass-array-of-multiple-arrays-for-looping/59778821#comment105701990_59778821
Добро пожаловать!!
Закрыть X