2017-01-31 2 views
2

Ich benutze Laravel 5.3 und MySQL. Ich habe versucht, Fremdschlüssel zu verwenden, um Daten aus einer anderen Tabelle abzurufen. Das Feld, das Daten anzeigt, die ich von der anderen Tabelle "Domaines" erhalten habe, ist eine Dropdown-Liste, aber sie ist immer leer.Verwendung von Fremdschlüsseln zum Abrufen von Daten || Laravel 5.3

Das ist mein ProjectController:

class ProjectController extends Controller 
{ 
    public function index(Request $request) 
    { 
     $projects = Project::orderBy('id','DESC')->paginate(5); 

     return view('projects.index',compact('projects')) 
      ->with('i', ($request->input('page', 1) - 1) * 5); 
    } 

    public function create() 
    { 
     $domaines = Domaine::pluck('name', 'id'); 

     return view('projects.create', compact('domaines')); 
    } 

    public function store(Request $request) 
    { 
     $domaine_id = Domaine::all()->pluck('name', 'id');  

     $this->validate($request, [ 
      'title' => 'required', 
      'code' => 'required',  
      'domaine_id' => 'required' 
      ]); 

     Project::create($request->all()); 

     return redirect()->route('projects.index') //???? add compact or not ?? 
        ->with('success','Project created successfully'); 
    } 

    public function show($id) 
    { 
     $project = Project::find($id); 

     return view('projects.show',compact('project')); 
    } 

    public function edit($id) 
    { 
     $project = Project::find($id); 
     return view('projects.edit',compact('project')); 
    } 

    public function update(Request $request, $id) 
    { 
     $this->validate($request, [ 
      'title' => 'required', 
      'code' => 'required', 
      'domaine_id' => 'required' 
     ]); 

     Project::find($id)->update($request->all()); 

     return redirect()->route('projects.index') 
        ->with('success','Project updated successfully'); 
    } 

    public function destroy($id) 
    { 
     Project::find($id)->delete(); 

     return redirect()->route('projects.index') 
        ->with('success','Project deleted successfully'); 
    } 
} 

und das ist show.blade.php:

<div class="col-xs-12 col-sm-12 col-md-12"> 
    <div class="form-group"> 
     <strong>Domaine:</strong> 
     {{ $project->domaine_id }} 
    </div> 
</div> 

create.blade.php:

<select class="form-control" name="domaine_id"> 
      @if (empty($domaine_id))          
       Whoops! Something went wrong        
      @else 
      @foreach($domaines as $domaine) 
       <option value="{{$domaine->id}}">{{$domaine->name}}</option> 
      @endforeach 
      @endif 
</select> 

Modell Project.php:

<?php 
namespace App; 
use Illuminate\Database\Eloquent\Model; 
use App\Domaine; 
class Pro extends Model 
{ 
    public $fillable = ['title','code','domaine_id']; 
} 

Migration: create_projects_table:

public function up() 
{ 
    Schema::create('projects', function (Blueprint $table) { 
     $table->increments('id', true); 
     $table->string('title'); 
     $table->string('code'); 
     $table->integer('domaine_id')->nullable(); 
     $table->foreign('domaine_id')->references('id')->on('domaines');   
     $table->timestamps(); 
    }); 
} 

public function down() 
{ 
    Schema::dropIfExists('projects'); 
} 

Jede Idee, warum die Liste immer leer ist? Ich habe Seeder so Tabellen in der DB sind nicht leer

Antwort

0
<select class="form-control" name="domaine_id"> 
      @if (empty($domaine_id))          
       Whoops! Something went wrong        
      @else 
      @foreach($domaines as $domaine) 
       <option value="{{$domaine->id}}">{{$domaine->name}}</option> 
      @endforeach 
      @endif 
</select> 

in diesem Abschnitt von Code überprüfen Sie leer ($ domaine_id), aber von Ihrem Controller haben Sie nicht Übergeben Sie diese Variable während des Ladens der Ansicht.

public function create() 
{ 
    $domaines = Domaine::pluck('name', 'id'); 
    return view('projects.create', compact('domaines')); 
} 

können Sie das, wenn die Bedingung wie unten ändern:

<select class="form-control" name="domaine_id"> 
      @if (!count($domaines) > 0)          
       Whoops! Something went wrong        
      @else 
      @foreach($domaines as $domaine) 
       <option value="{{$domaine->id}}">{{$domaine->name}}</option> 
      @endforeach 
      @endif 
</select> 

Durch die Art und Weise verwenden, um alle() anstelle von Innereien in der Steuerung.

+0

Vielen Dank, das funktioniert. Nun, die Art, wie es Daten anzeigt, ist nicht das, was ich wirklich wollte (etwa so: {"Domaine": "Name_Domaine1", "ID" : 1}). Aber zumindest ist die Liste nicht mehr leer – Naj

+1

Willkommen hoffe, es hilft dir. –

1

Eine Idee, warum die Liste immer leer ist?

Da Sie pluck() Methode verwenden, sollten Sie die Liste wie folgt durchlaufen:

@foreach($domaines as $id => $domaine) 
    <option value="{{ $id }}">{{ $domaine }}</option> 
@endforeach 

Oder benutzen Sie einfach get() oder all() ohne pluck():

$domaines = Domaine::get(['name', 'id']); 
+0

Ich versuchte alles(), aber es ändert nichts. Und get() erzeugt diesen Fehler: Argument 1 übergeben an Illuminate \ Database \ Grammar :: columnize() muss vom Typ Array, String gegeben sein, aufgerufen in C: \ Programme (x86) \ EasyPHP-Devserver-16.1 \ eds-www \ PC \ Hersteller \ Laravel \ Framework \ src \ Illuminate \ Datenbank \ Query \ Grammars \ Grammar.php auf Zeile 123 und definiert – Naj

+0

@Naj haben Sie versucht, 'pluck()' Ergebnis zu iterieren, wie ich gezeigt habe ? Versuchen Sie auch, dies zu verwenden, wenn Sie 'get()' verwenden: 'get (['name', 'id'])' –

+0

Ja, ich wiederhole pluck() Ergebnisse und ersetze pluck() durch get() – Naj

Verwandte Themen