Выпуск коллекции Laravel - PullRequest
       40

Выпуск коллекции Laravel

0 голосов
/ 28 февраля 2019

после долгих поисков и поиска в стеке, я решил, что мне нужна ваша помощь.

Мне нужно получить количество расходных материалов для каждого поставщика от определенного поставщика.Я знаю, это звучит странно, но позвольте мне объяснить:

У меня есть модель Поставщика, у которой много поставок, и у каждой поставки есть много запасов, у которых есть количество.Так что теперь я строю представление, в котором я хочу представить каждому Поставщику их количество по определенному поставщику.

Так вот, что я придумал в своем контроллере:

foreach ($suppliers as $supplier) {

        foreach($supplier->supplies as $supply){

            if(!$comp_supplies->contains('name', $supply->name)){

                $comp_supplies->push(['name'=>$supply->name, 'supplier'=>[['name'=> $supplier->name, 'quantity' => $supply->stocks->first()->quantity]]]);

            }elseif($comp_supplies->contains('name', $supply->name)){

                $array = (['name'=> $supplier->name, 'quantity' => $supply->stocks->first()->quantity]);
                $array2 = $comp_supplies->where('name', $supply->name)->first()['supplier'];

                array_push($array2, $array);

                //dd($array2);
                $comp_supplies->where('name', $supply->name)->first()['supplier'] = $array2;
                dd($comp_supplies->where('name', $supply->name)->first()['supplier']);
            }
        }

    }

Итак, яперебираю моих поставщиков и снова перебираю поставки от каждого из них.Теперь я хочу заполнить коллекцию, которую я хочу в результате.

Если эта коллекция не содержит поставки с именем «$ supply-> name», я помещаю массив с именем supply-name и создаю массив «поставщики», в котором я также устанавливаю первую запись с помощьютекущая информация о поставщике.

Теперь мы приближаемся к моей проблеме.

Если comp_supply уже содержит поставку с текущим именем поставки, если придется вытолкнуть нового поставщика в уже существующую«поставщик» массив, который мы создали в первом «если».

Поэтому я создал $ массив, который содержит информацию о новом поставщике, и $ array2, который содержит массив поставщика ($ comp_supplies-> где ('name', $ supply-> name) -> first () ['supplier']) мы уже сделали.

Теперь, если я помещу $ array в $ array2 и dd (массив2) все работает как я хочу.Но если я сейчас установлю

$comp_supplies->where('name', $supply->name)->first()['supplier'] = $array2 

, а затем

dd($comp_supplies->where('name', $supply->name)->first()['supplier']);

, то это не изменится.

Я застрял в этой проблеме почти на 2 часа и очень расстроился.

Пожалуйста, если у кого-нибудь есть идея, что я мог бы сделать, чтобы решить эту проблему, или знаете, где я могу посмотреть дальше, дайте мне знать.

Вот также миграции:

Поставщик:

public function up()
{
    Schema::create('suppliers', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name')->unique();
        $table->unsignedInteger('coordinates_id')->index()->nullable();
        $table->timestamps();
    });
}

Расходные материалы:

public function up()
{
    Schema::create('supplies', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->unsignedInteger('supplier_id');
        $table->foreign('supplier_id')
              ->references('id')
              ->on('suppliers')
              ->onDelete('cascade');
        $table->timestamps();
    });
}

Акции:

    public function up()
{
    Schema::create('stocks', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('supplies_id');
        $table->foreign('supplies_id')
              ->references('id')
              ->on('supplies')
              ->onDelete('cascade');
        $table->integer('quantity');
        $table->timestamps();
    });
}

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Ваша проблема связана с тем, как PHP работает с массивами.Массивы передаются по значению, а не по ссылке, поэтому, когда вы вызываете $comp_supplies->where('name', $supply->name)->first(), вы фактически получаете копию массива, и, следовательно, изменение значения индекса 'supplier' изменяет только значение копии, а не значениеисходный массив.

Вы можете проверить это поведение с помощью следующего примера кода:

class TestList
{
    protected $values;

    public function push($value)
    {
        $this->values[] = $value;
    }

    public function get($index)
    {
        return $this->values[$index];
    }
}

$list = new TestList();
$list->push(['test' => 1]);

var_dump($list->get(0)['test']); // int(1)

$list->get(0)['test'] = 2;
var_dump($list->get(0)['test']); // still int(1)... 

Вы можете решить эту проблему, используя объекты вместо массивов, поскольку объекты передаются по ссылке (обратите внимание на(object) литой):

$list = new TestList();
$list->push((object)['test' => 1]);

var_dump($list->get(0)->test); // int(1)

$list->get(0)->test = 2;
var_dump($list->get(0)->test); // int(2)!
0 голосов
/ 28 февраля 2019

Вместо

$comp_supplies->where('name', $supply->name)->first()['supplier'] = $array2;

Вы должны использовать:

$key = $comp_supplies->where('name', $supply->name)->get()->keys()->first();
$comp_supplies[$key]['supplier'] = $array2;

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

0 голосов
/ 28 февраля 2019

Попробуйте это

$comp_supplies->where('name', $supply->name)->first()->update($array2)

Вместо

$comp_supplies->where('name', $supply->name)->first()['supplier'] = $array2 
...