suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Erzählen Sie mir bitte etwas über die Eins-zu-Viele-Beziehung im eloquenten Modell von Laravel. Warum wird angezeigt, dass die Methode „Gehört zu“ nicht existiert?

Es gibt zwei Tabellen in der Datenbank, bei denen es sich um Eins-zu-Viele-Beziehungen handelt:

Haupttabelle (Reservierungsinformationen): dbo.Reservation

    [ReservationID] [INT] IDENTITY(1,1) NOT NULL,
    [ReservationNo] [NVARCHAR](24) NOT NULL,
    ......

Details (Reservierungsdetails): dbo.ReservationDetail

    [ReservationDetailID] [INT] IDENTITY(1,1) NOT NULL,
    [ReservationID] [INT] NOT NULL,                          --外键
    ......
Der Code von

Model lautet wie folgt:

Reservierung.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Reservation extends Model
{
    protected  $table = 'dbo.Reservation';

    public function hasManyReservationDetails()
    {
        return $this->hasMany('App\Models\ReservationDetail', 'ReservationID', 'ReservationID');
    }
}

ReservationDetail.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class ReservationDetail extends Model
{
    protected  $table = 'dbo.ReservationDetail';

    public function belongsToReservation()
    {
        return $this->belongsTo('App\Models\Reservation', 'ReservationID', 'ReservationDetailID');
    }

}

Rufen Sie einen API-Controller ein

<?php

namespace App\Api\Controllers;

use App\Models\Reservation;
use App\Models\ReservationDetail;
use App\Http\Requests;

class ReservationController extends BaseController
{

    public function showByReservationNo($reservation_no)
    {

        $reservation_details = ReservationDetail::all()
            ->belongsToReservation()
            ->where('ReservationNo', '=', $reservation_no)
            ->get();

        return $reservation_details;
    }
}

Die von Laravel zurückgegebene Fehlermeldung lautet wie folgt:

  "message": "Method belongsToReservation does not exist.",
  "status_code": 500,

Entschuldigung, was ist der Grund dafür? Ist es ein Namespace-Problem?

Was ich erreichen möchte, ist, eine bestimmte bedingte Zuordnung der Haupttabelle zu verwenden, um die detaillierte Tabelle abzufragen und die Daten der detaillierten Tabelle zurückzugeben. Die Abfrage-SQL-Anweisung lautet wie folgt:

SELECT ReservationDetail.*
FROM ReservationDetail
INNER JOIN Reservation ON Reservation.ReservationID = ReservationDetail.ReservationID
WHERE Reservation.ReservationNo = 'xxx'

Entschuldigung, Experten, wo liegt das Problem? Wie sollte die richtige Grammatik geschrieben werden?

Eine weitere Frage ist, ob die zurückgegebenen Daten durch Zusammenführen der Haupttabelle und der Detailtabelle in einem Objekt zurückgegeben werden sollen, zum Beispiel:

{
  "ReservationID": "1", 
  "ReservationNo": "201601011000", 
  "ReservationDetails": [
    {
      "ReservationDetailID": "1", 
    }, 
    {
      "ReservationDetailID": "2", 
    }
  ]
}

Wie schreibe ich eine entsprechende Abfrage? Bitte geben Sie mir einen Rat, vielen Dank! ! !

曾经蜡笔没有小新曾经蜡笔没有小新2807 Tage vor1356

Antworte allen(1)Ich werde antworten

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 16:54:40

    不是这么用的
    如果你要在查询的时候直接带出去,类似join,那就

        public function showByReservationNo($reservation_no)
        {
    
            $reservation_details = ReservationDetail::where('ReservationNo', '=', $reservation_no)
                ->with('belongsToReservation')
                ->get();
    
            return $reservation_details;
        }

    如果你要在取结果的时候用,就是相当于用的时候每条都SELECT Reservation where Reservation.ReservationID = xxx

        public function showByReservationNo($reservation_no)
        {
    
            $reservation_details = ReservationDetail::where('ReservationNo', '=', $reservation_no)
                ->get();
    
            foreach($reservation_details as $reservation_detail){
                $reservation = $reservation_detail->belongsToReservation;
                //todo: something you need
            }
            return $reservation_details;
        }

    参考手册

    Antwort
    0
  • StornierenAntwort