Welcome Guest, Not a member yet? Register   Sign In
foreach in foreach
#1

Hello,
I am new and a total beginner in programming.
Also, I'm totally bad in English, which I need to translate this with Googel.

Someone has recommended this framework to me because I have an internal database for collectibles.

Before I worked with a template system and pdo grinds involved and that is my question.
So I have in my old version two grinds connected.
Now I wonder how I should do this with this version?

-----------------------

Hallo,
ich bin neu und ein totaler anfänger in sachen programmierung.
Auch bin ich in Englisch total schlecht, das ich dies mit Googel Übersetzen muss.

Jemand hat mir dieses Framework empfohlen, da ich eine Interne Datenbank für Sammelkarten habe.

Vorher hab ich nur mit einem Template System gearbeitet und pdo schleifen eingebunden und das ist nun meine frage.
Also ich habe in meiner alten version zwei schleifen miteinander verbunden.
Nun frage ich mich, wie ich das mit diesem Version machen soll?


Old Version
PHP Code:
   $land_list = array();
 
   $land__sql "SELECT
                    *
                FROM
                    db_land
                WHERE
                    db_land.tb_land_id > 1
                ORDER BY
                    db_land.tb_land_name"
;
 
   $rs $db_test->select($land__sql);
 
   $land_list['land1'] = $rs;
 
   $page->set($land_list);
 
   extract($land_list);
 
   foreach ($land1 as $list1 => $value):
 
           $porto_list = array();
 
           $porto__sql "SELECT
                            *
                        FROM
                            db_porto
                        LEFT JOIN
                            db_land
                                ON
                                    db_land.tb_land_id = db_porto.tb_porto_land
                        LEFT JOIN
                            db_briefmarke
                                ON
                                    db_briefmarke.tb_briefmarke_id = db_porto.tb_porto_briefmarke
                        LEFT JOIN
                            db_versand_typ
                                ON
                                    db_briefmarke.tb_briefmarke_versand_typ = db_versand_typ.tb_versand_typ_id
                        WHERE
                            db_porto.tb_porto_land  = "
.$land1[$list1]['tb_land_id']."";
 
           $rs $db_test->select($porto__sql);
 
           $porto_list['porto'] = $rs;
 
           $page->set($porto_list);
 
           extract($porto_list);
 
           foreach ($porto as $list => $value):
 
           echo .....
 
           endforeach;

 
   endforeach

Framework version
Controller:
PHP Code:
           public function porto()
 
               {
 
                   if (!$this->session->userdata('logged_in'))
 
                       {
 
                           redirect('users/login');
 
                       }
 
                   $data['portos'] = $this->Admin_model->portos();
 
                   $data['lands'] = $this->Admin_model->lands();
 
                   $data['briefmarkes'] = $this->Admin_model->briefmarkes();
 
                   $this->load->view('templates/header_acp');
 
                   $this->load->view('admin/porto'$data);
 
                   $this->load->view('templates/footer');
 
               }

 
           public function lands()
 
               {
 
                   $this->db->select('*');
 
                   $this->db->from('db_land');
 
                   $this->db->order_by('tb_land_name');
 
                   $query $this->db->get();
 
                   return $query->result_array();
 
               


Model:
PHP Code:
           public function portos()
 
               {
 
                   $this->db->select('*');
 
                   $this->db->from('db_porto');
 
                   $this->db->join('db_land''db_land.tb_land_id = db_porto.tb_porto_land');
 
                   $this->db->join('db_briefmarke''db_briefmarke.tb_briefmarke_id = db_porto.tb_porto_briefmarke');
 
                   $this->db->join('db_versand_typ''db_versand_typ.tb_versand_typ_id = db_briefmarke.tb_briefmarke_versand_typ');
 
                   // $this->db->where('db_porto.tb_porto_land', 2);
 
                   // $this->db->where('db_porto.tb_porto_land');
 
                   // $this->db->where(array('tb_porto_land' => $land['tb_land_id']));
 
                   // $this->db->where($this->Admin_model->lands());
 
                   // $this->db->order_by('tb_briefmarke_aktiv', 'DESC');
 
                   // $this->db->order_by('tb_briefmarke_preis', 'ASC');
 
                   $query $this->db->get();
 
                   return $query->result_array();
 
               
Reply
#2

Lädst Du das Model zuvor im Controller?
Die Controller-Funktion lands() hat nichts mit dieser Frage zu tun, oder?
Es gibt in den Datenbanktabellen kein Feld, das genauso heisst wie in einer der anderen Tabellen?
Was kommt denn momentan dabei heraus (Fehlermeldung)?
Reply
#3

Vergiss mal die Codes von da oben.
Das habe ich anders gelöst

Wie erkläre ich es.
Im Anhang kannst du sehen das ich dort 2 foreach verwendet habe.

PHP Code:
    $shop_list2 = array();
    
$shop__sql2 "SELECT
                    *
                FROM
                    db_shop
                WHERE
                    db_shop.tb_shop_buy = 1
                ORDER BY
                    db_shop.tb_shop_name"
;
    
$rs $db_test->select($shop__sql2);
    
$shop_list2['shop2'] = $rs;
    
$page->set($shop_list2);
    
extract($shop_list2);
    foreach (
$shop2 as $liste2 => $value):
        
$buy_list = array();
        
$buy__sql "SELECT
                        SUM(tb_buy_gesamt) gesamtsumme,
                        SUM(tb_buy_abbezahlt) abbezahlt
                    FROM
                        db_buy
                    WHERE
                        db_buy.tb_buy_shop = "
.$shop2[$liste2]['tb_shop_id']."";
        
$rs $db_test->select($buy__sql);
        
$buy_list['buy'] = $rs;
        
$page->set($buy_list);
        
extract($buy_list);
        foreach (
$buy as $shop => $value):
        endforeach; 

So lass ich die namen auf der linken seite anzeigen und zur jeweiligen ID auch noch die summen.
Dies würde ich gerne auch im codeigniter umsetzen.
Aber leider komm ich nicht dahinter wie ich diese zweite foreach die ID zuweisen soll im WHERE.

Attached Files Thumbnail(s)
   
Reply
#4

Hey,

verschachtelte foreach-Abfragen in Verbindung mit Datenbank-Abfragen sind immer sehr unattraktiv.

... und du hast den richtigen Ansatz bereits in deinem ersten Post stehen:

Die Verwendung von JOIN in deiner Abfrage.
Du hast einen Primärschlüssel, z. B. ein Land, der als Fremdschlüssel in den anderen Tabellen ebenfalls auftaucht und darüber kannst du ganz einfach die Abhängigkeit der Datensätze untereinander abbilden.


Sollte das nicht die Lösung sein, nach der du suchst, bitte dein Anliegen präziser beschreiben.

Grüßle
Reply
#5

(This post was last modified: 08-25-2017, 06:26 AM by Germanikus.)

Also ich hab in meiner alten version das als ergebniss bekommen.
Dort sind die Inhalte von db_buy in den HTML Spalte von dem db_shop gerutscht
   

Aber wenn ich den neuen Code (unten) verwende.
So bekomme ich diese reichenfolge, was von der menge der ja stimmt.
Aber die Echos sind falsch
   

Richtig wäre ja, das was in diesem Bild zu sehen ist.
   

Also ich will die richtige Sume von den jeweiligen HTML Tabellen Spalte angezeigt bekommen

View:

Code:
<?php foreach ($shops_where_1 as $shop_where_1): ?></br>
<?php echo $shop_where_1['tb_shop_name']; ?> -
<?php
        $gesamtsumme = 0;
        foreach ($buy_sums as $buy_sum):
        if($buy_sum['tb_buy_shop']==$shop_where_1['tb_shop_id'])
            {
?>
<?php echo number_format($buy_sum['gesamtsumme'],2,",",".");?>,
<?php
            }
   endforeach;
?>
        </tr>
<?php endforeach; ?>


Model:

PHP Code:
public function shops_where_1()
{
 
   $this->db->select('*');
 
   $this->db->from('db_shop');
 
   $this->db->where('db_shop.tb_shop_buy = 1');
 
   $this->db->order_by('tb_shop_name');
 
   $query $this->db->get();
 
   return $query->result_array();
}

public function 
buy_sums()
{
 
   $this->db->select('(SELECT SUM(db_buy.tb_buy_gesamt) FROM db_buy) AS gesamtsumme');
 
   $this->db->select('(SELECT SUM(db_buy.tb_buy_abbezahlt) FROM db_buy) AS abbezahlt'FALSE);
 
   $this->db->select('tb_buy_shop');
 
   $this->db->from('db_buy');
 
   $query $this->db->get();
 
   return $query->result_array();


Controller:
PHP Code:
public function buy_shop($slug)
{
 
   // if (!$this->session->userdata('logged_in'))
 
       // {
 
           // redirect('users/login');
 
       // }
 
   $data['get_shops'] = $this->Admin_model->get_shops($slug);
 
   $data['shops_where_1'] = $this->Admin_model->shops_where_1();
 
   $this->load->view('templates/header_acp');
 
   $this->load->view('admin/buy_shop'$data);
 
   $this->load->view('templates/footer');



Edit:
Habs gerade gelöst
PHP Code:
    foreach ($shops_where_1 as $shop_where_1):
    
$query $this->db->query("SELECT SUM(tb_buy_gesamt) gesamtsumme FROM db_buy WHERE db_buy.tb_buy_shop = ".$shop_where_1['tb_shop_id']."");
    foreach (
$query->result() as $row)
        {
                echo 
$row->gesamtsumme;
                echo 
"</br>";
        }
    endforeach; 
Reply
#6

Ahhh, das mit den Summen habe ich überlesen...

Ich persönlich bin ja ein Fan von der in CodeIgniter eingebauten "Query Builder Class".
Die Summe, bzw. generell die SQL Aggregatfunktionen sind auch darüber abbildbar:

$this->db->select_sum()

https://codeigniter.com/user_guide/datab...ilder.html
Reply




Theme © iAndrew 2016 - Forum software by © MyBB