/ / Copier les données d’une rangée dans une autre rangée avec Eloquent (ou Fluent) de Laravel - laravel, laravel-4, éloquent, couramment

Copier les données d'une rangée dans une autre rangée avec Eloquent (ou Fluent) de Laravel - laravel, laravel-4, éloquent, couramment

C’est notre affaire. J’ai configuré ma base de données avec deux tables qui sont plus ou moins les suivantes (en fait, ma table est beaucoup plus complexe, mais c’est l’essentiel):

TABLE `éléments`

  • id
  • Les données

TABLE `element_drafts`

  • id
  • element_id
  • Les données

Comme vous pouvez peut-être deviner à partir des noms, lela deuxième table contient des lignes qui sont des brouillons de lignes dans la première table. (Ne vous souciez pas de recommander de meilleures façons de faire les brouillons =), mes tableaux sont plus complexes que ce qui est montré, et avoir un tableau de brouillons est la meilleure solution atm.

J’ai mis en place une relation entre les deux tables pour pouvoir faire des choses comme celle-ci:

// Get all of the elements along with their draft rows
$elements_with_drafts = Element::with("drafts")->all();

Je peux aussi ne sélectionner que les éléments qui ont des lignes brouillon en procédant ainsi

$elements_with_drafts = Element::with("drafts")
->whereIn("id", function($query)
{
$query->select("element_id")->from("element_drafts");
})
->get();

Mais il y a une chose que je voudrais faire et que je ne peux pas comprendre: copier les valeurs brouillons dans leur élément parent.

En fin de compte, mon objectif est de copier toutes les valeurs element_drafts ["data"] dans le champ de l'élément parent ["data"] via une requête unique.

Je ne suis pas tout à fait sûr que ce soit même possible.

À mon avis, cela pourrait être fait comme ceci:

$elements_with_drafts = Element::with("drafts")
->whereIn("id", function($query)
{
$query->select("element_id")->from("element_drafts");
})
->update(array("data" => function($query)
{
// Somehow select the draft value?
});

Je me sens vraiment proche, mais je ne sais pas trop comment faire ce que je veux. Des idées?

Remarque: évidemment, cela pourrait être accompli relativement facilement avec un foreach boucle, mais je "espère une solution qui est juste une requête simple.

Réponses:

7 pour la réponse № 1

Comme @Ben "s, seulement il a commis des erreurs:

DB::statement("UPDATE elements e
JOIN element_drafts d ON e.id = d.element_id
SET e.data = d.data");

En fait, vous pouvez utiliser Query Builder aussi:

DB::table("elements as e")
->join("element_drafts as d", "d.element_id", "=", "e.id")
->update(["e.data" => DB::raw("d.data")]);

Les deux fonctionneront de la même façon.

Attention, ça va se mettre e.data à d.data de la première ligne jointe (au cas où vous auriez plus de brouillons qu’un par élément).


2 pour la réponse № 2
DB::statement("UPDATE elements e
JOIN drafts d
SET e.data = d.data WHERE e.id = d.element_id");

EDIT: Vérifiez la réponse de deczo pour une solution Query Builder.