Laravel 5 add results from query in a foreach to array

心已入冬 提交于 2019-12-11 10:26:41

问题


I have a problem in my Laravel 5 application. My controller-method contains a foreach, which should iterate over a previous Eloquent-result-array (it is named $zipcodes). So each zipcode is used to fill a query, which result returns an Article-object (named $article). Every end of iteration it should add the Article-result to an array ($articles), which is used at the end of my method to display the Articles on my page. Maybe there is a better option for the performing of the Article-query, not every iteration, but I don't know how.

UPDATE

This is working for my problem, without perform the query in a foreach: Laravel multiple where clauses in query from given array

My code now is

// grabs all zipcodes matching the distance
$zipcodes = $this->getZipcodes($zipCoordinateId, $distance);

foreach ($zipcodes AS $key=>$val)
{
    $zipcodes[$key] = (array) $val;
}

$codes = array_column($zipcodes, 'zc_zip');

$articles = Article::whereIn('zipcode', $codes)->get();

return view('pages.intern.articles.index', compact('articles'));

UPDATE END

My SearchController:

<?php

namespace App\Http\Controllers;

use App\Article;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;

class SearchController extends Controller
{
public function getSearch(Request $request)
{
    if(($request->has('zipcode'))) {
        $zipcode = $request->input('zipcode');
        $distance = $request->input('distance');

        $zipCoordinateId = $this->getZipCoordindateId($zipcode);
        $zipcodes = $this->getZipcodes($zipCoordinateId, $distance);

        $articles = array();

        foreach($zipcodes as $value) {
            //$zipcode = $zipcodes[0]->zc_zip; // this is working
            $zipcode = $value->zc_zip;

            $article = Article::where('zipcode', $zipcode)->get();


           // add the $article each iteration to $articles
        }

        return view('pages.articles', compact('articles'));
    } else {
        return redirect('/articles');
    }
}

public function getZipCoordindateId($value) {
    $result = DB::table('zip_coordinates')
            ->where('zc_zip', '=' , $value)
            ->orWhere('zc_location_name', 'LIKE', $value)
            ->pluck('zc_id');
    return $result;
}

public function getZipcodes($id, $distance) {

    $result = DB::select(
        DB::raw("
            SELECT dest.zc_zip,
                ACOS(
                    SIN(RADIANS(src.zc_lat)) * SIN(RADIANS(dest.zc_lat))
                    + COS(RADIANS(src.zc_lat)) * COS(RADIANS(dest.zc_lat))
                    * COS(RADIANS(src.zc_lon) - RADIANS(dest.zc_lon))
                ) * 6380 AS distance
            FROM zip_coordinates AS dest
            CROSS JOIN zip_coordinates AS src
            WHERE src.zc_id = :id
            HAVING distance < :distance
            ORDER BY distance"), array('id' => $id, 'distance' => $distance));

    return $result;
}
}

my view:

@extends('layouts.default')

@section('content')
    <h1>All Articles</h1>
<hr/>

<search>
    {!! Form::open(['url' => 'intern/search']) !!}
        {!! Form::text('zipcode', null, ['class' => 'form-control']) !!}
        {!! Form::select('distance', [
          '5' => '5 km',
          '10' => '10 km',
          '25' => '25 km',
          '50' => '50 km',
          ], null, ['class' => 'form-control']) !!}
        {!! Form::submit('Suchen', ['class' => 'btn btn-success']) !!}
    {!! Form::close() !!}
</search>


@foreach($articles as $article)
    <article>
        <h2>
            <a href="{{ url('/articles', $article->id) }}">{{ $article->name }}</a>
        </h2>

        <div>
            <label>Description:</label>
            <p>{{ $article->description }}</p>
        </div>
        <div>
            <label>ZIPCODE:</label>
            {{ $article->zipcode }}
        </div>
        <div>
            <label>Published:</label>
            {{ $article->published }}
        </div>
        <div>
            <label>Rank:</label>
            {{ $article->rank }}
        </div>
    </article>
    <hr/>
@endforeach
@stop

Hope you can help me, thank you in advance. quantatheist

EDIT

When I use

foreach($zipcodes as $key => $value)
        {
            $articles[] = Article::where('zipcode', $value->zc_zip)->get();
        }
        print_r($articles);

With another zipcode in the search and updated zipcodes of my articles, it prints (at the moment, there are three articles in my database, the both first have zipcodes, which are in the range of my new zipcode-search):

Array
(
[0] => Illuminate\Database\Eloquent\Collection Object
    (
        [items:protected] => Array
            (
                [0] => App\Article Object
                    (
                        [fillable:protected] => Array
                            (
                                [0] => name
                                [1] => description
                                [2] => profile
                                [3] => driverlicense
                                [4] => zipcode
                                [5] => published
                                [6] => rank
                                [7] => contact
                                [8] => note
                                [9] => pictures
                                [10] => publisher
                            )

                        [connection:protected] => 
                        [table:protected] => 
                        [primaryKey:protected] => id
                        [perPage:protected] => 15
                        [incrementing] => 1
                        [timestamps] => 1
                        [attributes:protected] => Array
                            (
                                [id] => 5
                                [name] => Test1
                                [description] => Lorem ipsum dolor sit amet, consetetur 
                                [profile] => Lorem ipsum dolor sit amet, consetetur
                                [driverlicense] => yes
                                [published] => no
                                [rank] => 10
                                [contact] => 1
                                [pictures] => 
                                [zipcode] => 89429
                                [note] => 
                                [publisher] => 1
                                [created_at] => 2015-11-04 01:45:18
                                [updated_at] => 2015-11-04 10:07:24
                            )

                        [original:protected] => Array
                            (
                                [id] => 5
                                [name] => Test1
                                [description] => Lorem ipsum dolor sit amet, consetetur
                                [profile] => Lorem ipsum dolor sit amet, consetetur
                                [driverlicense] => yes
                                [published] => no
                                [rank] => 10
                                [contact] => 1
                                [pictures] => 
                                [zipcode] => 89429
                                [note] => 
                                [publisher] => 1
                                [created_at] => 2015-11-04 01:45:18
                                [updated_at] => 2015-11-04 10:07:24
                            )

                        [relations:protected] => Array
                            (
                            )

                        [hidden:protected] => Array
                            (
                            )

                        [visible:protected] => Array
                            (
                            )

                        [appends:protected] => Array
                            (
                            )

                        [guarded:protected] => Array
                            (
                                [0] => *
                            )

                        [dates:protected] => Array
                            (
                            )

                        [dateFormat:protected] => 
                        [casts:protected] => Array
                            (
                            )

                        [touches:protected] => Array
                            (
                            )

                        [observables:protected] => Array
                            (
                            )

                        [with:protected] => Array
                            (
                            )

                        [morphClass:protected] => 
                        [exists] => 1
                        [wasRecentlyCreated] => 
                    )

            )

    )

[1] => Illuminate\Database\Eloquent\Collection Object
    (
        [items:protected] => Array
            (
                [0] => App\Article Object
                    (
                        [fillable:protected] => Array
                            (
                                [0] => name
                                [1] => description
                                [2] => profile
                                [3] => driverlicense
                                [4] => zipcode
                                [5] => published
                                [6] => rank
                                [7] => contact
                                [8] => note
                                [9] => pictures
                                [10] => publisher
                            )

                        [connection:protected] => 
                        [table:protected] => 
                        [primaryKey:protected] => id
                        [perPage:protected] => 15
                        [incrementing] => 1
                        [timestamps] => 1
                        [attributes:protected] => Array
                            (
                                [id] => 6
                                [name] => Test2
                                [description] => Lorem ipsum dolor sit amet, consetetur 
                                [profile] => Lorem ipsum dolor sit amet
                                [driverlicense] => yes
                                [published] => no
                                [rank] => 3
                                [contact] => 1
                                [pictures] => 
                                [zipcode] => 89428
                                [note] => 
                                [publisher] => 1
                                [created_at] => 2015-11-04 01:45:38
                                [updated_at] => 2015-11-04 09:58:01
                            )

                        [original:protected] => Array
                            (
                                [id] => 6
                                [name] => Test2
                                [description] => Lorem ipsum dolor sit amet, consetetur 
                                [profile] => Lorem ipsum dolor sit amet
                                [driverlicense] => yes
                                [published] => no
                                [rank] => 3
                                [contact] => 1
                                [pictures] => 
                                [zipcode] => 89428
                                [note] => 
                                [publisher] => 1
                                [created_at] => 2015-11-04 01:45:38
                                [updated_at] => 2015-11-04 09:58:01
                            )

                        [relations:protected] => Array
                            (
                            )

                        [hidden:protected] => Array
                            (
                            )

                        [visible:protected] => Array
                            (
                            )

                        [appends:protected] => Array
                            (
                            )

                        [guarded:protected] => Array
                            (
                                [0] => *
                            )

                        [dates:protected] => Array
                            (
                            )

                        [dateFormat:protected] => 
                        [casts:protected] => Array
                            (
                            )

                        [touches:protected] => Array
                            (
                            )

                        [observables:protected] => Array
                            (
                            )

                        [with:protected] => Array
                            (
                            )

                        [morphClass:protected] => 
                        [exists] => 1
                        [wasRecentlyCreated] => 
                    )

            )

    )

[2] => Illuminate\Database\Eloquent\Collection Object
    (
        [items:protected] => Array
            (
            )

    )

)

EDIT 2

I print_r the articles from $articles = Article::all();, which uses the same return view('pages.articles', compact('articles')); and displays on the same site:

Illuminate\Database\Eloquent\Collection Object
(
[items:protected] => Array
    (
        [0] => App\Article Object
            (
                [fillable:protected] => Array
                    (
                        ...
                    )

                [connection:protected] => 
                [table:protected] => 
                [primaryKey:protected] => id
                [perPage:protected] => 15
                [incrementing] => 1
                [timestamps] => 1
                [attributes:protected] => Array
                    (
                        ...
                    )

                [original:protected] => Array
                    (
                        ...
                    )

                [relations:protected] => Array
                    (
                    )

                [hidden:protected] => Array
                    (
                    )

                [visible:protected] => Array
                    (
                    )

                [appends:protected] => Array
                    (
                    )

                [guarded:protected] => Array
                    (
                        [0] => *
                    )

                [dates:protected] => Array
                    (
                    )

                [dateFormat:protected] => 
                [casts:protected] => Array
                    (
                    )

                [touches:protected] => Array
                    (
                    )

                [observables:protected] => Array
                    (
                    )

                [with:protected] => Array
                    (
                    )

                [morphClass:protected] => 
                [exists] => 1
                [wasRecentlyCreated] => 
            )

        [1] => App\Article Object
            (
                [fillable:protected] => Array
                    (
                        ..
                    )

                [connection:protected] => 
                [table:protected] => 
                [primaryKey:protected] => id
                [perPage:protected] => 15
                [incrementing] => 1
                [timestamps] => 1
                [attributes:protected] => Array
                    (
                        ...
                    )

                [original:protected] => Array
                    (
                        ..
                    )

                [relations:protected] => Array
                    (
                    )

                [hidden:protected] => Array
                    (
                    )

                [visible:protected] => Array
                    (
                    )

                [appends:protected] => Array
                    (
                    )

                [guarded:protected] => Array
                    (
                        [0] => *
                    )

                [dates:protected] => Array
                    (
                    )

                [dateFormat:protected] => 
                [casts:protected] => Array
                    (
                    )

                [touches:protected] => Array
                    (
                    )

                [observables:protected] => Array
                    (
                    )

                [with:protected] => Array
                    (
                    )

                [morphClass:protected] => 
                [exists] => 1
                [wasRecentlyCreated] => 
            )

        [2] => App\Article Object
            (
                [fillable:protected] => Array
                    (
                        ..
                    )

                [connection:protected] => 
                [table:protected] => 
                [primaryKey:protected] => id
                [perPage:protected] => 15
                [incrementing] => 1
                [timestamps] => 1
                [attributes:protected] => Array
                    (..
                    )

                [original:protected] => Array
                    (
                        ..
                    )

                [relations:protected] => Array
                    (
                    )

                [hidden:protected] => Array
                    (
                    )

                [visible:protected] => Array
                    (
                    )

                [appends:protected] => Array
                    (
                    )

                [guarded:protected] => Array
                    (
                        [0] => *
                    )

                [dates:protected] => Array
                    (
                    )

                [dateFormat:protected] => 
                [casts:protected] => Array
                    (
                    )

                [touches:protected] => Array
                    (
                    )

                [observables:protected] => Array
                    (
                    )

                [with:protected] => Array
                    (
                    )

                [morphClass:protected] => 
                [exists] => 1
                [wasRecentlyCreated] => 
            )

    )

)

So the output from my print_r($articles) should be something like this.

EDIT 3

My current foreach is:

foreach($zipcodes as $key => $value)
        {
            //$code = $zipcodes[0]->zc_zip; // working, prints out one article
            //$article = Article::where('zipcode', $code)->get();
            $article = Article::where('zipcode', $value->zc_zip)->get();
            //print_r($article);
        }
        print_r($article);

回答1:


You have declared $articles = array(); and then you're passing $article (without the s) to compact function, that is why you get an undefined variable in your view, also when you are looping in the foreach you must do it like this :

@foreach($articles as $article)
....
@endforeach



回答2:


You could try this:

foreach($zipcodes as $key => $value)
{
    $articles[] = Article::where('zipcode', $value->zc_zip)->get();
}
return view('pages.articles', compact('articles'));

View:

@foreach($articles as $article)
<article>
    <h2>
        <a href="{!! url('/articles', $article->id) !!}">{!! $article->name !!}</a>
    </h2>

    <div>
        <label>Description:</label>
        <p>{!! $article->description !!}</p>
    </div>
    <div>
        <label>ZIPCODE:</label>
        {!! $article->zipcode !!}
    </div>
    <div>
        <label>Published:</label>
        {!! $article->published !!}
    </div>
    <div>
        <label>Rank:</label>
        {!! $article->rank !!}
    </div>
</article>
<hr/>
@endforeach


来源:https://stackoverflow.com/questions/33511113/laravel-5-add-results-from-query-in-a-foreach-to-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!