过滤雄辩的关系数据

时间:2016-07-22 12:41:21

标签: laravel eloquent laravel-5.2

我有以下问题,我有两个模型,Level和Class,每个级别里面都有很多类,我需要一次添加所有级别类,使用以下格式:

$levelclasses['0'][level_id]=1;
$levelclasses['0'][class][0][supervisor_id]=2;
$levelclasses['1'][level_id]=2;
$levelclasses['1'][class][0][supervisor_id]=2;

我成功地添加了这个:

    $levelNewClasses;
    $ids;
    $count=0;

    foreach ($data['levelclasses'] as $levelClass) {
        $level=\App\InstituteLevel::find($levelClass['level_id']);
        $ids[$count]=$level->id;
        $count++; 
        foreach ($levelClass['class'] as $classdata) {
             $class= new \App\EClass($classdata);
             $class->school_year_id=\App\SchoolsYear::first()->id;
             $level->classes()->save($class);
             $levelNewClasses[$level->id][$class->id]=$class->id;
        }
    }            

但是现在我想回复一下插入的类,而不是所有的类,如果我这样做:

$level->classes;

它将返回all,所以我将新类id存储在一个数组中,现在我尝试根据这些关系来过滤从这个关系$ level->类返回的类,我试过这个

foreach ($levels as $level){

        $levelclasses=$level->classes->pluck('id');

        $level->classes=$levelclasses->intersect($levelNewClasses[$level->id]);
    }

但这不起作用! , 有什么建议?

2 个答案:

答案 0 :(得分:1)

这有点像hacky方式,但如果你的模型有created_atupdated_at时间戳(默认情况下Eloquent模型会这样做),你可以看到它是创建的还是在最后几秒更新。例如,要查看它是否是在过去10秒内创建的:

foreach($level->classes as $class) {
  if($class->created_at->diffInSeconds(Carbon::now()) < 10) {
    // do something...
  }       
}

要执行此操作,您需要导入Carbon。将use Carbon\Carbon;放在班级的顶部即可。

基本上,上面的代码正在做的是弄清楚每个级别的类是什么时候创建的,将它在几秒钟内与当前时间进行比较,如果创建的类少于10秒,则输入if语句在当前时间之前(Carbon::now())。显然,你不一定要做10秒钟 - 找出最适合你的时间。

正如我所说,这有点像黑客,可能并不适用于所有情况,但我认为它适用于你所描述的情况。希望这有帮助!

答案 1 :(得分:1)

检查以下代码。我认为它会起作用。

    $levelNewClasses;
    $ids;
    $count=0;
    insertedClasses = array();//Array to store inserted classes
    foreach ($data['levelclasses'] as $levelIndex=>$levelClass) {\\updated to include level index
        $level=\App\InstituteLevel::find($levelClass['level_id']);
        $ids[$count]=$level->id;
        $count++; 
        foreach ($levelClass['class'] as $index=>$classdata) {
             $class= new \App\EClass($classdata);
             $class->school_year_id=\App\SchoolsYear::first()->id;
//Use following code to get all the inserted classes as array 
             $insertedClasses[$levelIndex][$index] = $level->classes()->save($class)->toArray();\\updated to use 2d array to store both level and class
             $levelNewClasses[$level->id][$class->id]=$class->id;
        }
    }