2017-01-18 3 views
2

Also verwende ich das Forms & HTML Paket und ich habe einige Schwierigkeiten mit der Ausgabe der Daten. Zum Beispiel:JSON-Daten mit Laravel Collection in HTML importieren HTML

wenn ich diesen Code:

{!! Form::model($article) !!} 
    {!! Form::textarea('categories', null) !!} 
{!! Form::close() !!} 

Was will ich hier erreichen, alle Kategorien aufzulisten ist, dass der Artikel bezieht. Wie folgt aus:

<textarea name="categories"> 
    Cat1 
    Cat2 
    Cat5 
</textarea> 

Aber ich weiß nicht, wie kann ich das Formular zur Ausgabe anweisen, nur eine bestimmte Spalte, so was passiert, ist, dass die textarea mit json Daten gefüllt ist (die alle Zeilen enthält) .

Ich weiß, dass die beste Lösung ist, einen Mehrfachselektor zu machen, aber in diesem Fall - ich muss Textarea verwenden.

+0

Können Sie in einfachen HTML-Tags tun und dann mit php loopen, um alle Kategorien aufzulisten? – EddyTheDove

+0

@EddyTheDove Ich kann das nicht tun, weil das Formular, das ich verwende, zum Erstellen und Aktualisieren von Ressourcen verwendet wird. –

+0

Ok. Ich verstehe. Aber Sie können das Formular immer noch so verwenden, wie Sie es gerade benutzen, und das nur für den Textbereich tun. Ich kann Ihnen einen Beispielcode zeigen, wenn Sie möchten. – EddyTheDove

Antwort

1

Versuchen Sie folgendes:

{!! Form::textarea('categories', implode('\n', $article->categories()->select('colName') 
     ->get()->pluck('colName')->all()) !!} 

colName Ersetzen mit dem Namen der Spalte Sie

wollen
+0

Ihr Artikel holen macht keinen Sinn. Zuerst wählen Sie die gewünschte Spalte, und dann erhalten Sie sie, und danach Sie pflücken es, was unnötig ist und dann holen Sie alle Zeilen. –

+0

'Haben Sie den Befehl versucht?'Zuerst wähle ich nur eine Spalte (um SQL-Ausgabe zu minimieren), dann bekomme ich die Sammlung, dann pflücke ich einen Spaltennamen aus der Sammlung (es verliert die Schlüsselwertstruktur), dann wandle ich das in ein Array um (mit all()), dann implode ich das Array für neue Zeileneinsätze. Verstehst du es jetzt? – Paras

+0

Erstens, ohne das Zupfen (was Sie sagen, ist unnötig), wird die Sammlung, wenn sie in ein Array konvertiert wird, in einem Schlüsselwertformular sein, das Sie nicht wollen. Zweitens, ich hole nicht alle Zeilen, alle() wird hier verwendet, um die Sammlung in ein Array zu konvertieren. Die Abfrage wurde bereits vor dem Aufruf von all() in der get() stage ausgelöst. – Paras

1

Um die Formularfelder zur Verfügung stellen enthalten sowohl in einem Update-Formular werden (Form::model) und in einer erstellen Form (Form::open), habe ich etwas wie folgt aus:

{!! Form::textarea('categories', isset($article) ? implode(PHP_EOL, $article->categories()->pluck('name')->toArray()) : null) 

Was ich da tat, war die Überprüfung zunächst, ob der $article existiert. Wenn dies der Fall ist, bedeutet das, dass ich die Form::model verwendet habe. Wenn die $article existiert, erhalte ich die Liste der Kategorien als Array und implodiere in PHP_EOL ("\ n").

Aber wenn es keine $article gibt, bedeutet dies, dass das Formular ein Erstellungsformular sein soll, so dass die Daten leer sind.

Ich habe diese Lösung dank Paras gefunden. Aber auch wenn unsere Ergebnisse gleich sind, ist die Abfrage dieser Ergebnisse unterschiedlich.

Mein Ergebnis Abfrage lautete:

select `display_name` from `categories` inner join `article_categories` on `categories`.`id` = `article_categories`.`category_id` where `article_categories`.`article_id` = ? 

Paras' Ergebnis Abfrage ist:

select `display_name`, `article_categories`.`article_id` as `pivot_article_id`, `article_categories`.`category_id` as `pivot_category_id` from `categories` inner join `article_categories` on `categories`.`id` = `article_categories`.`category_id` where `article_categories`.`article_id` = ? 

Beide Abfragen sind die gleichen, aber es sieht aus wie meine Frage etwas kleiner ist, so dass ich werde mit dieser Abfrage gehen.

+0

Schöne Arbeit am SQL-Vergleich. Nun, da Sie beide Abfragen gedruckt haben, denke ich, dass ein direktes Zupfen in der Leistung etwas besser sein könnte. Danke für die Information! Dies sollte die richtige Antwort sein, upvoting – Paras

+0

@Paras danke, sehr geschätzt :) –