php
  • laravel
  • foreach
  • 2017-12-04 6 views 0 likes 
    0

    私は、結果セット内でリレーションを設定してループしているときに、Laravel foreachモデルの結果セットをループすると、奇妙な結果が戻されます

    これは、現在のコードです:

    $deadlines =  App\Deadlines::where('beginDatum', '<=', date("Y-m-d")) 
                  ->where('eindDatum', '>=', date("Y-m-d")) 
                  ->first(); 
    $totalActivities = App\UserActivity::where('userid', Auth::id()) 
                   ->where('deadline', '=', $deadlines->id) 
                   ->count(); 
    if($totalActivities > 0) { 
         $activiteiten = \App\User::find(Auth::id()); 
         //dd($activiteiten->useractivities); 
         foreach($activiteiten->useractivities as $user_activity) { 
          if($deadlines->id == $user_activity->deadline) { 
           print_r("<div class='col-md-4'><input type='text' value='$user_activity->datum' class='form-control'></div>"); 
            foreach($user_activity->activity as $activity) { 
             print_r("<div class='col-md-7'><input type='text' value='$activity->activiteit' class='form-control'></div>"); 
            } 
            print_r("<div class='col-md-1'><input type='submit' class='btn btn-primary' value='Edit'></div>"); 
          } 
         } 
    } else { 
    ?> 
        <br/>U heeft nog geen activiteiten toegevoegd! 
    <?php 
    } 
    ?> 
    

    しかしuser_activityテーブル内の重複のActivityIDがあるときには、いくつかの奇妙な行動を持っています。たとえば、次のようになります。

    | -------------------------------------- |
    |日付|ユーザーID |アクティビティID |
    | -------------------------------------- |
    | 2017-12-28 | 1 | 1 |
    | | 2017-11-30 | 1 | 1 |
    | -------------------------------------- |

    アクティビティの名前は同じですが、アクティビティの名前は同じですが、重複アクティビティの日付のみが表示される理由はわかりません。https://gyazo.com/11cc6828f97e7a191bf40c8b74448e83

    +0

    Uhhhh ..どこから始めるのです... – Option

    +0

    これらはEloquentモデルであると仮定して、ユーザーの活動と締め切り間に多対多の関係を使用すべきではありませんか? – Uthr

    +0

    '$ deadlines = App \ Deadlines'を実行していて、名前空間の下にこれらを追加せず、' $ deadlines = Deadlines :: where() 'を実行するのはなぜですか? – Option

    答えて

    0

    この種のクエリでは、Laravel Eloquent多対多リレーションシップを使用する必要があります。

    あなたはLaravel 5.5を使用していると仮定すると、このドキュメントのエントリが役立ちます:

    https://laravel.com/docs/5.5/eloquent-relationships#many-to-many

    基本的には、お使いのモデルの定義では、あなたが関係を設定する必要があります。たとえば、期限モデルの定義では、次のようなものがあるでしょう:

    <?php 
    
    namespace App; 
    
    use Illuminate\Database\Eloquent\Model; 
    
    class Deadline extends Model 
    { 
        /** 
        * The activities associated with this deadline 
        */ 
        public function activities() 
        { 
         return $this->belongsToMany('App\UserActivity'); 
        } 
    } 
    

    あなたは、これはあなたに関連するすべてのモデルに設定している場合、あなたはこのようなことを行うことができます。

    $user = App\User::findOrFail(Auth::id()); 
    $today = date("Y-m-d"); 
    
    $activities = $user->activities->whereHas('deadlines', function ($query) { 
        $query->where('beginDatum', '<=', $today)->where('eindDatum', '>=', $today; 
    })->get(); 
    
    関連する問題