2017-05-12 10 views
0

私はLaravelを使ってページ設定を行う際に問題が発生しました。laravelのページネーションはデータベースに新しい行を挿入します

これは私のコントローラのメソッドです:

public function manageElection(Request $r,$id,$idx){ 
    $program = MProgram::find($idx); 

    $person = MPeople::find($id); 

    $treatment = Treatment::where('people_id',$person->id)->first(); 

    if($treatment!=null){ 
     $treatment->relation($program->id);// se supone que esto lo pone en la tabla N-N 
    }else{ 
     $treatment = new Treatment(); 
     $treatment->people_id = $id; 
     $treatment->user_id = 1; //Cuando este la autentificación acabada, esto habrá que cambiarlo 
     $treatment->center_id = 1; //ESTO HAY QUE CAMBIARLO 
     $treatment->saveTreatment(); 
     $treatment->relation($program->id);// se supone que esto lo pone en la tabla N-N 
    } 

    $mgobjectives = Mgobjective::all(); 

$ msobjectives = Msobjective ::のpaginate(7);

return view('addPeopleProgram')->with('gobjectives',$mgobjectives)->with('sobjectives',$msobjectives)->with('program',$program)->with('treatment',$treatment); 

}

これがルートである:

Route::any('/electionProgram/{id}-{idx}','[email protected]'); 

これは図:ページネーションが動作

@extends('layouts.app') 
@section('content') 
<div class="row"> 
    <div class="col-md-8 col-md-offset-2"> 
     <div class="row"> 
      <a href="/elementos">Atrás</a> 
     </div> 
     <form method="POST" action="/addPeopleObjective /{{$program->id}}" > 
     {{ csrf_field() }} 
     <div class="row"> 
      <div class="col-md-6"> 
       <h3>Añade objetivos generales a este programa</h3> 
       <div class="form-group"> 
        <ul class="list-unstyled"> 
         @foreach($gobjectives as $gobjective) 
          <li> 
           <label>{{$gobjective->name}}</label> 
           <div class="checkbox"> 
            <label><input value="{{$gobjective->id}}" type="radio" name="gobjectives{{$gobjective->id}}" class="subject-list">Si</label> 
            <!--<label><input value="no" type="radio" name="{{$gobjective->name}}{{$gobjective->id}}" class="subject-list">No</label>--> 
           </div> 
          </li> 
         @endforeach 
        </ul> 
       </div> 
      </div> 
      <div class="col-md-6"> 
       <h3>Añadir objetivos específicos a este programa</h3> 
       <div class="form-group"> 
        <ul class="list-unstyled"> 
         @foreach($sobjectives as $sobjective) 
          <li> 
           <label>{{$sobjective->name}}</label> 
           <div class="checkbox"> 
            <label><input value="{{$sobjective->id}}" type="radio" name="sobjectives{{$sobjective->id}}" class="subject-list">Si</label> 
            <!---<label><input value="noS" type="radio" name="{{$sobjective->name}}{{$sobjective->id}}" class="subject-list">No</label>--> 
           </div> 
          </li> 
         @endforeach 
        </ul> 
       </div> 
       {{ $sobjectives->links() }} 
      </div> 
     </div> 
     <div class="row"> 
      <input type="submit" value="Terminar"/> 
     </div> 
    </form> 
</div> 

@endsection

、PR

public function relation($id){ 
    $this->programs()->attach($id); 
} 

:oblemは、私は2ページを選択すると、Laravelは(再び)オブジェクトの処理と、それは関係がモデルの治療方法である

$treatment->saveTreatment(); 
$treatment->relation($program->id); 

プログラムでぐるぐるという関係を保存しようとしています誰かが何が起こっているかもしれないという考えを持っていますか?私はlokingしてきましたが、私のようなケースはありませんでした。前もって感謝します!

編集:私は持っている

エラーは次のとおりです。

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '7-1' for key 'mprogram_treatment_mprogram_id_treatment_id_unique' 
+0

@Christophvhは、あなたのコードは、データを取得するために、別のために削除して、そのデータを保存する機能を持っている必要があり、言ったようにに。あなたが学んだ場所やLaravelを教えた人がわからないが、それを行うためのより簡単でより良い方法がある(Doctrineリポジトリを使用している場合などは、ページャーツールがある) –

+0

あなたの治療クエリの挿入クエリは、各ページ。したがって、ページを切り替えるたびに実行されます。適切なif条件でブロックする必要があります。 – Dinoop

+0

はい、私は何かを見せたい時から店を分けなければならないことを理解していますが、それをまとめる理由は、DBに治療を保存した後に、他の方法私はそれを一緒にしない場合は動作しません。 –

答えて

1

あなたのルートを区切る必要があります。あなたは、同じコントローラメソッドでデータを取得し、データをポストしています。そのため、データを収集しようとするたびに、データベースに新しいレコードがポストされます。

以下は例です(これはおそらく動作するコードではありませんが、ポイントを示すためです)。

あなたのデータを保存するには、次の

public function storeElection(Request $r,$id,$idx){ 
    $program = MProgram::find($idx); 

    $person = MPeople::find($id); 

    $treatment = Treatment::where('people_id',$person->id)->first(); 
    $treatment->relation($program->id); 

    if($treatment->isEmpty()){ 
     $treatment = new Treatment(); 
     $treatment->people_id = $id; 
     $treatment->user_id = 1; //Cuando este la autentificación acabada, esto habrá que cambiarlo 
     $treatment->center_id = 1; //ESTO HAY QUE CAMBIARLO 
     $treatment->saveTreatment(); 
     $treatment->relation($program->id);// se supone que esto lo pone en la tabla N-N 
    } 

    // Return here to a view where you can see your data 

、あなたのデータ表示したいあなたのコントローラ:

Route::post('/electionProgram/{id}-{idx}','[email protected]'); 
:あなたのデータを格納するために

public function showObjectives() 
{ 

$mgobjectives = Mgobjective::all(); 
$msobjectives = Msobjective::paginate(7); 

return view('addPeopleProgram', compact('mgobjectives','msobjectives'); 

} 

別々のルート

例のルートを

例ルートは、あなたのデータを取得し、それを

Route::get('/electionObjectives', '[email protected]') 

Psのページ付けします

  • 私はあなたのコードに関連した答えをしました。しかし、このコードは実際には ではありません。これを見てください: https://laravel.com/docs/5.4/controllers#resource-controllers。それは あなたのコードをはるかに良い構造になります。

    • コントローラーの名前から判断すると、1つのコントローラー内ではあまりにも多くの作業を行っています。たとえば、ロジックを分離するためにPeopleController/TreatmentController/ObjectiveControllerが必要になります。 (私はあなたが構築しているかわからないので、これは単なる仮定である。)
+0

私はストアの選挙に参加していれば問題がありますが、同じオブジェクトを持つビューaddPeopleProgramと同じものを表示したいと思います。目的のタイプを示す必要があるため、それらも関連付ける必要があります。私が上の私のコメントのようにそれをしなければ、私は今どのようにしないのですか?私はあなたが私に言うことをしましたが、今私はこの問題を抱えています。 –

+0

私はObjectController TreatController y PeopleControllerも持っていますが、別のコントローラからあるコントローラのメソッドを呼び出す方法はわかりません。 –

+0

コントローラはシンプルなクラスにのみ対応しています。だから、OOPで作業する方法を学ぶだけです。 –

関連する問題