Laravel - Übergeben Sie mehr als eine Variable zum Anzeigen

73

Ich habe diese Seite und eine ihrer Seiten erstellt eine einfache Liste von Personen aus der Datenbank. Ich muss einer Variablen, auf die ich zugreifen kann, eine bestimmte Person hinzufügen.

Wie ändere ich die return $view->with('persons', $persons);Zeile, um auch die Variable $ ms an die Ansicht zu übergeben?

    function view($view)
    {
        $ms = Person::where('name', 'Foo Bar');

        $persons = Person::order_by('list_order', 'ASC')->get();

        return $view->with('persons', $persons);
    }
pjmil
quelle

Antworten:

98

Übergeben Sie es einfach als Array:

$data = [
    'name'  => 'Raphael',
    'age'   => 22,
    'email' => '[email protected]'
];

return View::make('user')->with($data);

Oder verkette sie, wie @Antonio erwähnt.

rmobis
quelle
5
Weitaus eleganter als das Verketten 'mit'
S ..
3
Die empfohlene Methode ist die Verwendung einer kompakten Methode zum Übergeben von Variablen. Das fühlt sich etwas eleganter an.
Vaishnav Mhetre
Ich denke, ein Teil der Auswahl würde auf den Daten basieren. Für eine einfache Variable funktioniert dies jedoch mit verschachtelten Daten in einer Variablen compact oder mit am besten für die Bearbeitung in der Ansicht.
FabricioG
95

Das ist wie man es macht:

function view($view)
{
    $ms = Person::where('name', '=', 'Foo Bar')->first();

    $persons = Person::order_by('list_order', 'ASC')->get();

    return $view->with('persons', $persons)->with('ms', $ms);
}

Sie können auch compact () verwenden :

function view($view)
{
    $ms = Person::where('name', '=', 'Foo Bar')->first();

    $persons = Person::order_by('list_order', 'ASC')->get();

    return $view->with(compact('persons', 'ms'));
}

Oder machen Sie es in einer Zeile:

function view($view)
{
    return $view
            ->with('ms', Person::where('name', '=', 'Foo Bar')->first())
            ->with('persons', Person::order_by('list_order', 'ASC')->get());
}

Oder senden Sie es sogar als Array:

function view($view)
{
    $ms = Person::where('name', '=', 'Foo Bar')->first();

    $persons = Person::order_by('list_order', 'ASC')->get();

    return $view->with('data', ['ms' => $ms, 'persons' => $persons]));
}

In diesem Fall müssten Sie jedoch folgendermaßen darauf zugreifen:

{{ $data['ms'] }}
Antonio Carlos Ribeiro
quelle
Ja, ich bin in der Zwischenzeit so weit gekommen. Aber jetzt, wenn ich versuche, in der Ansicht darauf zuzugreifen, zB {{ $ms->name }}bekomme ich Undefined property: Laravel\Database\Eloquent\Query::$nameWas fehlt mir?
pjmil
Sie vermissen das ->first()in der ersten Zeile Ihrer Methode.
RMOBIS
1
pjmil116 wurde gerade bearbeitet, um den ->first()Raphael hinzuzufügen, über den kommentiert wurde.
Antonio Carlos Ribeiro
Ah ja, ich habe es verstanden. Ich habe gerade festgestellt, dass dieses Projekt Laravel 3 ist und somit eine große Quelle meiner Frustration ist. Musste die Abfragesyntax auf$ms = DB::first('select * from people where name = "Foo Bar"');
pjmil
1
Die Syntax von Laravel 4 und 3 ist für gängige Dinge wie diese ziemlich gleich. Sie können immer noch verwenden Person::where('name', '=', 'Foo Bar')->first(). Bearbeitet.
Antonio Carlos Ribeiro
30

Verwenden Sie kompakt

function view($view)
{
    $ms = Person::where('name', '=', 'Foo Bar')->first();

    $persons = Person::order_by('list_order', 'ASC')->get();
    return View::make('users', compact('ms','persons'));
}
sumit
quelle
21

Übergeben mehrerer Variablen an eine Laravel-Ansicht

//Passing variable to view using compact method    
$var1=value1;
$var2=value2;
$var3=value3;
return view('viewName', compact('var1','var2','var3'));

//Passing variable to view using with Method
return view('viewName')->with(['var1'=>value1,'var2'=>value2,'var3'=>'value3']);

//Passing variable to view using Associative Array
return view('viewName', ['var1'=>value1,'var2'=>value2,'var3'=>value3]);

Lesen Sie hier, wie Sie Daten an Ansichten in Laravel übergeben

Akshay Khale
quelle
4

Ist auf ein ähnliches Problem gestoßen, aber wenn Sie nicht unbedingt eine Ansicht mit Ansichtsdatei zurückgeben möchten, können Sie Folgendes tun:

return $view->with(compact('myVar1', 'myVar2', ..... , 'myLastVar'));
Makan
quelle
3

Diese Antwort scheint zu sein

etwas hilfreich beim Deklarieren der großen Anzahl von Variablen in der Funktion

Laravel 5.7. *

Zum Beispiel

public function index()
{
    $activePost = Post::where('status','=','active')->get()->count();

    $inActivePost = Post::where('status','=','inactive')->get()->count();

    $yesterdayPostActive = Post::whereDate('created_at', Carbon::now()->addDay(-1))->get()->count();

    $todayPostActive = Post::whereDate('created_at', Carbon::now()->addDay(0))->get()->count();

    return view('dashboard.index')->with('activePost',$activePost)->with('inActivePost',$inActivePost )->with('yesterdayPostActive',$yesterdayPostActive )->with('todayPostActive',$todayPostActive );
}

Wenn Sie die letzte Zeile der Retouren sehen, sieht sie nicht gut aus

Wenn Ihr Projekt größer wird, ist es nicht gut

Damit

public function index()
    {
        $activePost = Post::where('status','=','active')->get()->count();

        $inActivePost = Post::where('status','=','inactive')->get()->count();

        $yesterdayPostActive = Post::whereDate('created_at', Carbon::now()->addDay(-1))->get()->count();

        $todayPostActive = Post::whereDate('created_at', Carbon::now()->addDay(0))->get()->count();

        $viewShareVars = ['activePost','inActivePost','yesterdayPostActive','todayPostActive'];

        return view('dashboard.index',compact($viewShareVars));
    }

Wie Sie sehen, werden alle Variablen als Array von deklariert $viewShareVarsund in der Ansicht aufgerufen

Aber meine Funktion wird sehr groß, deshalb habe ich beschlossen, die Linie so einfach wie möglich zu gestalten

public function index()
    {
        $activePost = Post::where('status','=','active')->get()->count();

        $inActivePost = Post::where('status','=','inactive')->get()->count();

        $yesterdayPostActive = Post::whereDate('created_at', Carbon::now()->addDay(-1))->get()->count();

        $todayPostActive = Post::whereDate('created_at', Carbon::now()->addDay(0))->get()->count();

        $viewShareVars = array_keys(get_defined_vars());

        return view('dashboard.index',compact($viewShareVars));
    }

Die native PHP-Funktion get_defined_vars() erhält alle definierten Variablen von der Funktion

und array_keys greift nach den Variablennamen

Aus Ihrer Sicht können Sie also auf alle deklarierten Variablen innerhalb der Funktion zugreifen

wie {{$todayPostActive}}

Manojkiran.A
quelle
2

Bitte versuchen Sie dies,

$ms = Person::where('name', 'Foo Bar')->first();
$persons = Person::order_by('list_order', 'ASC')->get();
return View::make('viewname')->with(compact('persons','ms'));
Reshma
quelle
1
    $oblast = Oblast::all();
    $category = Category::where('slug', $catName)->first();
    $availableProjects = $category->availableProjects;
    return view('pages.business-area')->with(array('category'=>$category, 'availableProjects'=>$availableProjects, 'oblast'=>$oblast));
Dragana Posen
quelle
0

Versuchen Sie es, um mehrere Array-Daten vom Controller an die Anzeige zu übergeben. Es funktioniert. In diesem Beispiel übergebe ich Betreffdetails aus einer Tabelle und Betreffdetails enthalten die Kategorie-ID. Die Details wie Name, wenn die Kategorie-ID aus einer anderen Tabellenkategorie abgerufen wird.

$category = Category::all();
$category = Category::pluck('name', 'id');
$item = Subject::find($id);
return View::make('subject.edit')->with(array('item'=>$item, 'category'=>$category));
Deepak Kumar
quelle
0

withFunktion und singleParameter:

    $ms = Person::where('name', 'Foo Bar');
    $persons = Person::order_by('list_order', 'ASC')->get();
    return $view->with(compact('ms', 'persons'));

withFunktion und arrayParameter:

    $ms = Person::where('name', 'Foo Bar');
    $persons = Person::order_by('list_order', 'ASC')->get();
    $array = ['ms' => $ms, 'persons' => $persons];
    return $view->with($array);
Arash Younesi
quelle
-1

Es ist einfach :)

<link rel="icon" href="{{ asset('favicon.ico')}}" type="image/x-icon" />
Walid Fouad
quelle
Dieser scheint im Vergleich zu anderen Antworten etwas fehl am Platz zu sein.
s3c