Soll ich in Laravel gehört zu oder hasOne verwenden?


74

Betrachten Sie zwei Modelle AundB

A-> relatedTo Bist eine one to oneBeziehung

Was ist der Unterschied bei der Verwendung von (A -> hasOne- B) und (A -> belongsTo- B)?

Kann ich sie austauschbar verwenden?

Antworten:


188

Nein, der Unterschied hängt davon ab, wo sich Ihr Fremdschlüssel befindet.

Wenn in Ihrem Beispiel Aeine b_idSpalte vorhanden ist, dann A belongsTo B.

Wenn Bhat eine a_idSpalte, dann A hasOneoder hasMany Babhängig davon, wie viele haben Bsollten.


25
Vielen Dank. Sie sind der einzige, der erklärt, wo sich die Schlüssel befinden. Alle anderen versuchen es auf "Englisch" zu erklären, aber manchmal sind Ihre Modelle einfach zu abstrakt, um überhaupt einen Sinn zu ergeben.
Mpen

Konnte nicht Bauch BelongTo A?
Zaki Aziz

3
Nehmen wir an, das Ahat eine b_idSpalte. In diesem Fall kann ich A.belongsTo(b)oder verwenden B.hasOne(A). In beiden Fällen wird ORM b_idzur ATabelle hinzugefügt . Also, was ist der Unterschied hier? Würden Sie bitte erklären?
Vladyslav Turak

1
Diese beiden Beziehungen sind nur umgekehrt. Sie haben Recht, sie sind im Grunde das gleiche. Das Einrichten von beiden ist jedoch nützlich, wenn Sie nachfragen müssen, Baber alles, was Sie haben, ist die ID für eine A. Dann müssten Sie etwas tun, A::find($id)->Bdas diese A.belongsTo(b)Beziehung verwendet. Umgekehrt, wenn Sie nach einem fragen müssen, Aaber alles, was Sie hatten, ist die ID für ein B, dann brauchen Sie die B.hasOne(A)Beziehung B::find($id)->A.
user1669496

1
Die Frage betraf speziell den Unterschied zwischen hasOne und Gehört zu.
user1669496

76

Der Hauptunterschied ist wie folgt:

belongsTound belongsToMany- Sie sagen Laravel, dass diese Tabelle den Fremdschlüssel enthält, der sie mit der anderen Tabelle verbindet.

hasOneund hasMany- Sie sagen Laravel, dass diese Tabelle keinen Fremdschlüssel enthält.


3
Ich denke, Ihre Antwort ist einfacher und verständlicher. Vielen Dank!
Alexey Shabramov

Ich denke nicht, dass das ganz richtig ist. Eine belongstoMany(viele-zu-viele) Beziehung hält den Schlüssel nicht auf der Tabelle selbst, sondern auf der Pivot-Tabelle.
Martin

Gute Antwort, dies hilft, die Logik hinter den Funktionsnamen zu verstehen.
Developerbmw

0

Das Modell, dessen Tabelle den Fremdschlüssel enthält, hat Gehört zu (), während das Modell, dessen Tabelle den Primärschlüssel enthält, auf den sich dieser Fremdschlüssel bezieht, hasOne () hat ... es ist einfach, dass das Modell, das den Fremdschlüssel hat have Gehört zu () und derjenige, der den Fremdschlüssel in dieser Beziehung nicht enthält, hat hasOne (). und nein, sie sind nicht mit der falschen Methode austauschbar. Als Ergebnis wird immer null zurückgegeben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.