SQL séparation, PHP et la vue lors de l'inscription des catégories et des produits Kohana

StackOverflow https://stackoverflow.com/questions/1498893

  •  19-09-2019
  •  | 
  •  

Question

Je veux migrer vers Kohana avec mes petits sites et je suis en train de séparer le SQL, PHP et la vue, mais j'ai quelques problèmes avec celui-ci.

Je dois tables. Chaque catégorie peut avoir plusieurs produits.

table Catégories

  • id
  • catégorie

table produits

  • id
  • category_id
  • produit

Ce fut mon code précédent (converti au générateur de requêtes de Kohana):

        $categories = DB::select('id', 'category')
            ->from('categories')
            ->as_object()
            ->execute();

    foreach ($categories as $category)
    {
        echo '<b>'.$category->category.'</b><br />';
        $products = DB::select('product')
                ->from('products')
                ->where('category_id', '=', $category->id)
                ->as_object()
                ->execute();

        foreach($products as $product)
        {
            echo $product->product.'<br />';
        }
        echo '<hr />';
    }

Je veux faire la même chose, juste dans le fichier de vue, je ne veux pas utiliser autre que l'écho des variables.

Mise à jour: Je préférerais une solution sans utiliser le module ORM de Kohana. BTW J'utilise Kohana 3.0

Mise à jour 2:

Je l'ai accepté la dernière solution de Lukasz, mais quelques modifications sont nécessaires pour faire exactement ce que je voulais (noter que ceci est pour Kohana 3.0, tandis que Lukasz travaillait avec une ancienne version):

code SQL:

$products = DB::select(array('categories.category', 'cat'), array('products.product', 'prod'))
                ->from('categories')
                ->join('products','RIGHT')
                ->on('products.category_id','category.id')
                ->as_object()
                ->execute();

code dans le fichier de vue (voir les commentaires pour l'explication):

        // Let's define a new variable which will hold the current category in the foreach loop
        $current_cat = '';
    //We loop through the SQL results
    foreach ($products as $product)
    {
        // We're displaying the category names only if the $current_cat differs from the category that is currently retrieved from the SQL results - this is needed for avoiding the category to be displayed multiple times
        // At the begining of the loop the $current_cat is empty, so it will display the first category name
        if($curren_cat !== $product->cat)
        {
            // We are displaying a separator between the categories and we need to do it here, because if we display it at the end of the loop it will separate multiple products in a category
            // We avoid displaying the separator at the top of the first category by an if statement
            if($current_cat !== '')
            {
                //Separator
                echo '<hr />';
            }
            // We echo out the category
            echo '<b>'.$product->cat.'</b><br />';
            // This is the point where set the $current_cat variable to the category that is currently being displayed, so if there's more than 1 product in the category the category name won't be displayed again
            $current_cat = $product->cat;
        }
        // We echo out the products
        echo $product->prod.'<br />';
    }

J'espère que cela a été utile pour les autres aussi bien, si quelqu'un a une meilleure solution aller, partager!

Était-ce utile?

La solution

Cela devrait fonctionner:

$categories = ORM::factory('category')->find_all();

foreach ($categories as $category)
{
    echo '<b>'.$category->category.'</b><br />';
    $products = ORM::factory('product')->where('category_id',$category->id)->find();

    foreach($products as $product)
    {
        echo $product->product.'<br />';
    }
    echo '<hr />';
}

Je suppose que vous avez créé des modèles pour chaque table? Sinon, lisez .

Mieux si vous séparer des couches de données et afficher. Et créer des relations entre les catégories et produits dans les fichiers de modèle. Ensuite, dans le contrôleur, vous devez appeler seulement ceci:

$categories = ORM::factory('category')->find_all();
$view = new View('yourView');
$viem->categories = $categories;

Et dans le fichier de vue:

foreach ($categories as $category)
{
    echo '<b>'.$category->category.'</b><br />';

    foreach($category->products as $product)
    {
        echo $product->product.'<br />';
    }
    echo '<hr />';
}

Vous ne devrez pas appeler 2ème requête pour chaque ligne. Kohana ORM va le faire pour vous. Tout ce que vous avez à faire est de créer des modèles appropriés:

class Category_Model extends ORM {
    protected $has_many = array('products');
}

class Product_Model extends ORM {
    protected $belongs_to = array('category');
}

Une autre approche: vous pouvez joindre des tables catégories et produits

$products = DB::select('categories.category AS cat','products.product AS prod')
                    ->from('categories')
                    ->join('products','products.category_id','category.id')
                    ->as_object()
                    ->execute();

Et puis:

$current_cat = '';

foreach($products as $product)
{
    if($current_cat != $products->cat)
    {
        echo '<b>'.$products->cat.'</b><br />';
        $current_cat = $products->cat;
    }

    echo $product->prod.'<br />';
}

Autres conseils

Juste une pensée rapide:

Lorsque vous utilisez l'ORM-approche, je pense que vous pourriez réaliser la même chose que d'une jointure-requête en utilisant la méthode avec ():

$products = ORM::factory('product')
  ->with('category')
  ->find_all();
$view = new View('yourView');
$viem->products = $products;

Je n'ai pas eu assez de temps à perdre avec elle, mais c'est ce que je voudrais essayer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top