2017-01-31 24 views
2

私はlaravel 5.3とMySQLを使用しています。私は別のテーブルからデータを取得するために外部キーを使用しようとしていました。私が他のテーブル "ドメイン"から得たデータを表示するフィールドはドロップダウンリストですが、それは常に空です。外部キーを使用してデータを取得する方法|| laravel 5.3

これは私の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'); 
    } 
} 

、これは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> 

モデルProject.php:

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

移行: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'); 
} 

リストは常に空である理由を任意のアイデア?私はシーダーを持っているので、DBのテーブルは空ではありません

答えて

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> 

あなたが空($ domaine_id)をチェックするが、あなたのコントローラからは、あなたはしなかったビューの読み込み中にこの変数を渡します。

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

あなたがもし条件以下のように変更することができます:ところで

<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> 

は、コントローラに代わりに摘むの)すべての(使用しています。

+0

ありがとう、これは動作しています。データを表示する方法は、私が本当に望んでいたものではありません({"domaine": "name_domaine1"、 "id" :1})。しかし、少なくともリストは空ではなくなりました。 – Naj

+1

それがあなたを助けてくれることを歓迎します。 –

1

なぜリストは常に空ですか?

あなたがpluck()メソッドを使用しているので、あなたは、このようにリストを反復処理する必要があります。

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

それともpluck()なしget()またはall()を使用:このセクションで

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

私はall()を試しましたが、何も変わりません。 Illuminate \ Database \ Grammar :: columnize()に渡される引数1は、C:\ Program Files(x86)\ EasyPHP-Devserver-16.1で呼び出される配列型の文字列である必要があります。 \ eds-www \ PC \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Query \ Grammars \ Grammar.php 123行目に定義されています。 – Naj

+0

@Najここに示したように 'pluck()'の結果を繰り返してみましたか? ? –

+0

はい、pluck()の結果を反復し、pluck()をget()で置き換えます。 – Naj