Skip to content
Advertisement

Laravel or PHP foreach issue on DB::Table vs. Model::get()

The code below works fine:

$data = Structures::select("id", "parent_id", "category", "type", "subType", "variant", "description")
        ->orderBy('category')
        ->orderBy('type')
        ->orderBy('subType')
        ->orderBy('variant')
        ->get() ;

        return $this->fillCategories($data) ;

The fillCategories() function fills a JSON tree with parent child relationships.

However, the code below, doesn’t work.

  $data = DB::table("categories AS t1")
        ->select("t1.id", "t1.name AS category", "t2.id as typeId", "t2.name as type", "t3.id as subTypeId", "t3.name as subType", "t4.id as variantId", "t4.name as variant")
          ->leftJoin("categories AS t2", "t2.parent_id", "=", "t1.id")
          ->leftJoin("categories AS t3", "t3.parent_id", "=", "t2.id")
          ->leftJoin("categories AS t4", "t4.parent_id", "=", "t3.id")
            ->whereNull("t1.parent_id")
              ->orderBy("t1.name")
              ->orderBy("t2.name")
              ->orderBy("t3.name")
              ->orderBy("t4.name")
            ->get() ;

            foreach ($data as $v) {
              Log::info("cat: " . json_encode($v));
            }

        return $this->fillCategories($data) ;

The local log returns values, but when $data is passed to fillCategories() the foreach in the function ignores the $data!

Snippet of the foreach in fillCategories()

...
      $select = array() ;
      $child = array() ;

      $cat = null ;
      $type = null ;
      $sub = null ;
      $first = true ;

      $clear = true ;
      $label = null ;
      $value = null ;

      $prev = null ;

     Log::info("fillCat: data = " . json_encode($data)) ;

     foreach ($data as $v):

        Log::info("fillCat forloop: v($v->cat, $v->type, $v->subType, $v->variant)") ;

        $parent = null ;
        $isKid = false ;
        $isGrandKid = false ;

...

I’m assuming for now that passing $data to the function from DB::table rather than FacadesAppModelStructures::get() somehow gets lost in translation.

Advertisement

Answer

Thanks Faiz, apparently orderBy was the issue! (!) If I take it out, fillCategories() the foreach processes the data.

$data = DB::table("categories AS t1")
        ->select("t1.id", ...)
          ->leftJoin("categories AS t2", "t2.parent_id", "=", "t1.id")
          ->leftJoin("categories AS t3", "t3.parent_id", "=", "t2.id")
          ->leftJoin("categories AS t4", "t4.parent_id", "=", "t3.id")
            ->whereNull("t1.parent_id")
              ->orderBy("t1.name")
              ->orderBy("t2.name")
              ->orderBy("t3.name")
            ->get() ;

This works. Maybe Taylor Otwell can tell me why!

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement