2017-01-31 2 views
2

Я использую laravel 5.3 и MySQL. Я пытался использовать внешние ключи для извлечения данных из другой таблицы. Поле, которое будет отображать данные, которые я получил из другой таблицы, «domaines» - это раскрывающийся список, но он всегда пуст.Как использовать внешние ключи для извлечения данных || 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'); 
} 

Любая идея, почему список всегда пуст? У меня есть сеялка, поэтому таблицы в БД не пустые

ответ

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 

Или просто использовать get() или all() без pluck():

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

Я пробовал все(), но ничего не меняет. И get() сгенерируйте эту ошибку: Аргумент 1 передан в Illuminate \ Database \ Grammar :: columnize() должен быть из массива типа, заданного строкой, вызываемого в 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()' result, как я показал ? Кроме того, попробуйте использовать это при использовании 'get()': 'get (['name', 'id'])' –

+0

Да, я повторил результаты pluck() и заменил pluck() на get() – Naj

Смежные вопросы