Fixation d'un hasOne modèle à l'autre Laravel/Éloquent modèle sans spécifier l'id
Fond
Étant donné que nous avons les deux tableaux suivants où type_id fait référence à une ligne dans questionType:
question
id | type_id | description
---+---------+------------
1 | 1 | A nice question
.. | .. | ..
questionType
id | name
---+----------------
1 | Multiple-choice
.. | ..
avec le suivant Éloquent modèles:
class Question extends Model {
public function type() {
return $this->hasOne( 'QuestionType', 'id', 'type_id' );
}
}
class QuestionType extends Model {
}
Question 1
Comment puis-je ajouter une nouvelle question, qui fait référence à un existant type de question sans manuellement de faire quelque chose avec les identifiants? Par exemple, les travaux suivants, mais c'est moche de l'omi depuis que j'ai attribuer manuellement la question correspondante de type id:
$q = new Question;
$q->type_id = 1; //Multiple-choice
$q->description = 'This is a multiple-choice question';
$q->save();
L'on pense, il y avait un moyen pour que l'ORM gérer les id-attribution (qui n'est pas le point pour éviter que ce genre de choses avec Orm?), quelque chose le long des lignes de (cela ne fonctionne pas dans Éloquent ORM):
$q = new Question;
$q->type = QuestionType.where('name', '=', 'Multiple-choice');
$q->description = 'This is a multiple-choice question';
$q->save();
Question 2
Par rapport à la question 1, comment pourrais-je aller sur l'ajout d'une nouvelle question, qui fait référence à un nouveau type de question sans manuellement de faire quelque chose avec les identifiants? De même, j'imagine quelque chose le long des lignes de:
$t = new QuestionType;
$t->name = 'Another type';
$q = new Question;
$q->type = $t;
$q->description = 'This is a multiple-choice question';
$q->save();
Ici, je voudrais $q->save()
à enregistrer à la fois le type de question et de remettre en question (ou quelque chose de similaire).
Les ouvrages suivants, mais encore une fois je suis d'attribution de l'identifiant de moi-même qui, je crois, l'ORM doit gérer:
$t = new QuestionType;
$t->name = 'Another type';
$t->save();
$q = new Question;
$q->type = $t->id;
$q->description = 'This is a multiple-choice question';
$q->save();
J'ai essayé de jouer avec différentes combinaisons de save()
, update()
méthodes sans succès. J'ai aussi regardé pour attach()
qui existe sur le hasMany
les relations, mais qui semblent manquer dans hasOne
.
attach
estbelongsToMany
(plusieurs-à-plusieurs avec pivot) de la méthode, de sorte qu'il ne fonctionne pas sur leshasMany
relation.hasOne
/hasMany
fournirsave
méthode, ce qui est assez logique, puisqu'il vous faudra sauver le modèle lorsque vous changez de son domaine (clé étrangère).
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous avez mal compris la relation que vous consultez.
Voici ce que vous devez:
ensuite, vous pouvez les lier ensemble comme ceci:
Vous pouvez transmettre explicitement un id d'associer ainsi:
Vous ne pouvez pas faire ceci:
de cette façon Éloquente gère les attributs de modèle, pas de relations.
Question 2:
hasOne
etbelongsTo
. Dans mon esprit$this->hasOne('QuestionType')
où$this
est unQuestion
signifie que Question est un QuestionType. Après tout qu'est ce que cela implique quand vous réel à haute voix à droite?. Mais apparemment, c'est l'inverse -- déroutant!$question->questionType = $someQuestionType;
. Code: PastebinRépondre à la question 1 pour moi, les deux méthodes sont bonnes, vous n'avez pas besoin de changer quoi que ce soit.
Répondre à la question 2, vous devriez faire comme vous l'a montré. ORM ne crée pas automatiquement
QuestionType
jusqu'à ce que vous utilisez manuellementsave
méthode.Par exemple, si vous avez utilisé le code:
ce ORM devrait en décider? La Question n'est pas connecté à l'une des
$t
ou$t2
donc ORM ne pas décider pour vous. Vous devez dire à l'ORM quel est le type.Je ne suis pas un ORM/Éloquent expert, mais je pense que vous avez trop attendre de l'ORM. ORM ne devrait pas deviner ce que vous voulez faire. Il vous aide à gérer les relations ou les objets, mais il ne sera pas associer des objets si vous ne dites pas à le faire.
Vous pouvez toutefois essayer avec mutateur. Vous pouvez ajouter à votre Question, modèle:
et maintenant, il devrait être possible d'utiliser
$q->type = $t;
(je n'ai Cependant pas testé)$q->type = $t
, donc je ne suis pas sûr que je comprends votre préoccupation à propos de ce que l'ORM devrait en décider. Bien sûr, il doit enregistrer $t et $q à$q->save()
, et si vous ne vous connectez pas $t2 à rien ou enregistrer manuellement il n'est pas enregistré.