Bonjour,

Je suis en train de bosser sur un site avec la partir eloquent de Laravel. Je n'utilise pas tout le framework laravel.

J'ai bossé avec le Zend Framework (v1.x) avant, au niveau des models il y a 2 classes

  • un model "table" qui s'occupe des requetes
  • un model "row" qui correspond à l'enregistrement.

Ce qui donne par exemple :

$tblUserAdmin = new tblUserAdmin();

$rows = $tblUserAdmin->getUsersFromGroup('group');

foreach ($rows AS $row) {
echo $row->getPostalAdress();
}

Pour l'instant je n'ai pas vu dans laravel si c'est possible et comment reproduire ce comportement.

Si vous avez des pistes je suis preneur :)

Kaimite

4 réponses


quenti77
Réponse acceptée

C'est le seul point qui peut bloquer dans laravel mais qui fait aussi la force de Eloquent (et je comprends à l'utilisation leur choix). Au lieu de faire un pattern DataMapper (Table + Entity) ils ont fait un pattern ActiveRecord (Table et Entity dans le même objet).

Par contre cela permet de faire les relations directement et d'avoir de la souplesse. Si vraiment tu veux éviter le DRY tu as plein de solutions comme par exemple les scopes et de faire des repository qui ferait les requêtes :

Par exemple un modèle pour les Articles :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Post extends Model
{
    public function user(): BelongsTo
    {
        return $this->belongsTo(UserModel::class);
    }

    public function scopeActive($query)
    {
        return $query->where('active', '=', 1);
    }

    public function scopeLast($query, int $nb = 10)
    {
        return $query->orderBy('created_at', 'DESC')->take($nb)->skip(0);
    }
}

Un Repository/Services/Table comme tu veux :

<?php

namespace App\Repositories;

use App\Models\Post;

class PostRepository
{
    public function getLastActive(int $nb = 10)
    {
        return Post::active()->last($nb)->get();
    }

    public function getLast(int $nb = 10)
    {
        return Post::last($nb)->get();
    }
}

Et dans le contrôleur tu pourrait injecter la dépendance du repository (dans la méthode ou le constructeur) et donc y avoir accès.

Bonjour.
Il te suffit de regarder dans la documentation de Laravel : Eloquent: Getting Started.

Kaimite
Auteur

Salut,

Merci pour ta réponse à la "rtfm"...
Mais c'est bien ce que j'ai fait :)

Dans cette doc à chaque fois qu'il y a une requete elle est fait dans un controller avec des methodes statiques

On a donc d'une part :

$rows = App\Model\Customer::all();

et quand je fais un

<h2>Utilisateurs</h2>
<ul>
    <?php foreach($rows as $row) : ?>
        <li><?= get_class($row) . '<br />' . $row->adm_nom ?></li>
    <?php endforeach; ?>
</ul>

get_class renvoie App\Model\Customer
Donc, et sauf erreur de ma part on a donc la même class qui s'occupe de faire les requetes (sur Zend le tblModel) et qui est l'enregistrement (sur Zend le rowModel).

J'ai également vu les histoire de customCollection, que j'ai essayé mais la collection est l'ensemble des résultats et ne correspond pas à ma recherche.

Donc, si tu utilises Laravel, comment fais tu pour séparer toutes les requetes et les méthodes spécifiques à un enregistrement.

Je trouve que faire la requete à chaque fois dans le controller n'est pas super "DRY".

Merci de tes réponse et désolé si je pose des questions bêtes.

Kaimite

Kaimite
Auteur

Merci pour ta réponse, je vais regarder un peu les Repository, ensuite quitte à utiliser une librairie autant adopter sa philosophie au maximum.

Bon week-end

Kaimite