2012-10-24 1 views
1

CodeIgniter에서 초보자입니다.Codeigniter - 배열이 아닌 구조/객체로 관련 데이터 행 얻기

피자 테이블 및 성분 표의 모델을 만들었습니다. 테이블은 추가 Pizza_Ingredients 테이블 (많은 관계를 다 대다)에 의해 조인됩니다.

내 모델 :

<?php 

class Pizza extends DataMapper { 

    var $table = 'Pizza'; 

    var $has_many = 
     array(
     'ingredients' => 
      array(
      'class' => 'ingredients', 
      'join_table' => 'pizza_ingredients' 
      ) 
     ); 
} 

class Ingredients extends DataMapper { 

    var $table = 'Ingredients'; 
    var $has_many = 
     array(
      'pizza' => 
       array(
       'class' => 'pizza', 
       'join_table' => 'pizza_ingredients' 
      ) 
     ); 
} 

?> 

그 코드를 사용하여 데이터를 얻을 때 :

$pm = new Pizza(); 
$pm->include_related('ingredients'); 
$array = $pm->get(); 

메신저 (그냥 SQL 쿼리의 결과처럼 보인다) 피자 값을 복제 한 배열을 받고.

margherita | cheese 
vegetariana | vegetable 1 
vegetariana | vegetable 2 

"foreach"에서 html 테이블을 이와 같이 배열로 생성 할 수 없습니다.

margherita: 
- cheese 

vegetariana: 
- vegetable 1 
- vegetable 2 

나 "피자 루프"내부 (재료) 다른 foreach 루프와 (피자와) foreach 루프를 만들 수 있습니다 :

는이 같은 구조를 가지고 그 객체를 싶어.

PHP로 작성해야하거나 CodeIgniter/DataMapper가 나를 위해 더 많은 것을 할 수 있습니까?

어떤 조언이 필요합니까?

+0

위의 클래스/메소드보다 get 메소드와 관련이 있다고 생각합니다. get 메소드에서 배열의 키를 DB에서 반환하는 피자로 설정하면됩니다. 재료가 들어올 때보 다 각 재료에 대한 피자마다 새로운 배열을 갖는 대신 피자 배열을 추가하게됩니다. –

+0

좋아, 그래서 내 피자에 대한 사용자 지정 액세서를 작성해야합니다. 그러나 CodeIgniter 스타일로 효율적으로 수행하는 방법은 무엇입니까? 누군가가 작은 예제를 넣을 수 있습니까? – Kamil

답변

-1

현재 사용중인 피자 변수를 설정하고 다음 반복에서 확인하십시오. 귀하의 서식 및 기타 등등 다를 수 있지만 이것은 당신에게 아이디어를 줄 것이다.

foreach ($pizza as $k=>$p) { 
    if ($last_pizza === $p->pizza) { 
     echo "<tr> 
      <td> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       $p->cheese 
      </td> 
     </tr>"; 
     $last_pizza = $p->pizza; 
    }else{ 
     echo "<tr> 
      <td> 
       $p->pizza 
      </td> 
     </tr> 
     <tr> 
      <td> 
       $p->cheese 
      </td> 
     </tr>"; 
     $last_pizza = $p->pizza; 
    } 
} 
+0

이것은 내가 무엇을 찾고 있는지 아니지만 아마도 "pizza_with_ingredients"객체를 작성하는 데 비슷한 코드를 사용합니다. 나는 더 좋은 방법이 있다고 믿을 수 없다 ... – Kamil

0

대다수 관계를 분해하기 위해 중개 테이블을 사용하지 않는 이유는 무엇입니까? 관리가 훨씬 쉬워 보입니다. 마찬가지로 그런 다음

TABLE pizza_ingredients 
    id 
    pizza_id 
    ingredient_id 

이 같은 시도 할 수 있습니다 : CI를 Datamapper의 문서를 검색,

foreach($pizzas as $pizza) 
    $pizza->ingredients = $this->get_ingredients($pizza->id); 
+0

만약 pizza_ingredients 행에 루프가 있다면 - 좋은 생각 인 것 같다. 그러나 get_igredients는 "쿼리 결과를 얻을 수있는 것과 같은 30 개의 쿼리를 실행하지 않는 한 쿼리의 버퍼링 된 데이터에서 작동해야한다고 생각한다. ". 내가 무슨 뜻인지 알지? – Kamil

+0

30 피자가 있다면, 네가 db를 31 번 치게 될 것이다. 이상적이지 않습니다. 피자 이름을 중복해서 무시하는 것이 어떨까요? SQL 수준에서 중첩 된 select로 재생하려고합니다. select x, y (select z ...) ... 이러한 유형의 쿼리는 시행 착오를 거칩니다. 그러나 결국 단일 쿼리는 중첩 된 데이터가 아닌 행을 반환합니다. – Jahmic

+0

나는 3 개의 테이블 (피자, 관계 테이블, 재료)에서 모든 데이터를 가져 와서 배열에 넣을 수 있습니다. 그런 다음 관계 배열에 대한 foreach를 만들면 3 개의 쿼리 만 작성합니다. 하지만 시간이있어, 어쩌면 누군가가 더 나은 아이디어를 내놓을 것입니다. – Kamil

1

난 그냥 같은 대답에 갇혀있어 ... 그래서

을 나는 발견 뭔가 도움이 될만한 것 (http://datamapper.wanwizard.eu/pages/getadvanced.html), 첫 번째 예제를보십시오!

문제에 번역, 다음과 같이해야한다 :

// Create pizza 

    $pm = new Pizza(); 

    // DO NOT USE include_related to Ingredients Here !!! 
    //Datamapper will DO THIS for you! 
    // Remember to declare your Ingredients class in singular, not plural 
    // So your class should be in singular -> Ingredient 
    // And your DB Table should be in plural -> Ingredients 
    // As CI Datamapper Guide teaches :) 

    // Get all pizzas 

    $pm->get(); 

    // Loop through all pizzas 

    foreach ($pm as $pizza) 
    { 

    // Print the actual pizza name 

      echo $pizza->name."<br/>"; 

      // Get the current pizza's Ingredients <- Here is the magic comes! 

      $pizza->ingredient->get(); 

      // Print all current pizza's Ingredients 

      foreach ($pizza->ingredient as $ingredient) 
      { 
        echo $ingredient->name."<br/>"; 
      } 
    } 

나에게 매우 잘 작동하지만 각 피자, 실제로 DB에게 시간을 많이 칠 한 번 계속 당신의 DB 포함.

CI Datamapper를 사용하는 일부 솔루션이 DB에 대한 요청을 덜 받아 주면 정말 고맙습니다.

찾아 주시면 공유하십시오!

+0

나는 그것을하기에 가장 좋은 방법은 조인이있는 큰 SQL 쿼리 일 것 같아요. 유일한 문제는 쿼리에 의해 반환 된 데이터의 형식입니다. "트리 구조"가 아닌 레코드 집합입니다. – Kamil