2 votes

Laravel pluck nested collection to Root collection

dd(Order)

J'ai une structure de données comme vous pouvez le voir dans l'image ci-dessus.
J'ai besoin de certains champs de l'utilisateur dans la collection Racine, mais je ne sais pas comment je peux l'obtenir.

public function index (Request $request) {
    $draw = $request->get('draw');
    $start = $request->get('start');
    $length = $request->get('length');

    $order = Order::with('user');
    $total_order = $order->count();
    $orders =  Order::with('user')->offset($start)->limit($length)->get();

    /*$draw = ceil($total_order/$length);*/
    return response()->json([
        'draw' => $draw,
        'recordsTotal' => $total_order,
        'recordsFiltered' => $total_order,
        'data' => $orders,
    ]);
}

0voto

mrhn Points 2499

L'approche flatmap semble bizarre, vous avez deux modèles Order et Users, soit vous devez ajouter des propriétés supplémentaires aux orders à la volée, ce qui est bizarre dans le cas de Laravel si vous souhaitez enregistrer à nouveau le modèle. Ou bien vous devez le convertir en tableaux et vous perdez la fonctionnalité du modèle.

Au lieu d'essayer d'aplatir l'objet utilisateur sur l'ordre. Vous utilisez déjà with() L'utilisateur est donc impatient et peut s'y fier. Utilisez plutôt Eloquent Getters et de faire correspondre les champs de l'utilisateur à la commande.

class Order extends Model
{
    public function getUserNameAttribute() {
        return $this->user->name;
    }
}

Le nom de la fonction des getters éloquents doit être au format getPropertyAttribute . Vous pourrez désormais y accéder de cette manière, ce qui peut également être fait dans blade, etc.

foreach ($orders as $order) {
    $userName = $order->userName;
}

0voto

Yinci Points 161

Si vous voulez vraiment que les valeurs liées se trouvent dans la collection Racine, vous pouvez effectuer une jointure gauche sur la table :

$orders = Order::leftJoin('users', 'users.id', '=', 'orders.user_id')

(Sur la base des noms de modèles, il s'agit des noms de tables et de colonnes corrects).

Cependant, comme Mrhn vient de le souligner, il n'est pas très éloquent d'essayer d'avoir des données de tables liées dans la collection Racine du modèle principal.

P.S. Si vous utilisez la jointure gauche, veillez à ne sélectionner que les données dont vous avez besoin. volonté écraser les données de l'ordre (telles que id )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X