2017-01-24 4 views
0

Ich habe zwei Modelle Fahrzeuge und Bild, Fahrzeug hasMany BilderHolen Sie sich Wert von einer zu vielen Beziehungen. Laravel

public function images(){ 
    return $this->hasMany('App\Image'); 
} 

Bild belongsTo ein Fahrzeug:

public function vehicle(){ 
    return $this->belongsTo('App\vehicle'); 
} 

I Fahrzeuge wie abgerufen haben: In Controller:

$ads=ads::orderBy('views','desc')->get(); 
foreach ($ads as $ad) { 
    $popularvehicles[]=vehicles::where('id',$ad->Vehicleid)->get()->toArray(); 
} 

Ansicht:

@foreach($popularvehicles as $popularvehicle) 
    @foreach($popularvehicle as $vehicle) 
     {{$vehicle['vname']}} 
    @endforeach 
@endforeach 

Jetzt möchte ich ein Bild abrufen, das zu $ ​​Fahrzeug gehört. Ich habe folgende Syntax versucht:

@foreach($popularvehicles as $popularvehicle) 
    @foreach($popularvehicle as $vehicle) 
      @foreach($vehicle->image as $image) 
      <a href="page-product-details.html"> 
      <img src="{{ asset("images/$image->title") }}" alt="{{ $image->title }}" > 
      </a> 
      @endforeach 
    @endforeach 
@endforeach 

Aber es wirft eine Ausnahme: Der Versuch, Eigentum von Nicht-Objekt zu erhalten. Was kann ich tun, um es richtig zu machen?

+0

haben einen Blick auf diese. https://laracasts.com/discuss/channels/requests/laravel-issue-in-getting-the-value-of-one-to-many-relationship –

+0

$ popularvehicles [] = Fahrzeuge :: where ('id' , $ ad-> VehicleID) -> mit ('images') -> get() -> toArray(); –

+0

Versuch $ vehicle-> images als $ image? – LordMarty

Antwort

0

Nur ein einfaches Beispiel:
Sie haben ein Modell, das Modell hat Details in einem anderen Modell.

class Vehicle extends Model 
{ 
    protected $fillable = [ 
     'brand', 
     'etc', 
    ]; 

    public function details() 
    { 
     return $this->belongsToMany('App\VehicleDetails'); 
    } 
} 

Und die Details Modell:

class VehicleDetails extends Model 
{ 
    protected $fillable = [ 
     'color', 
     'engine', 
    ]; 

    public function vehicle() { 
     return $this->belongsTo('App\Vehicle'); 
    } 

} 

Normalerweise verwende ich Transformatoren die benötigten Daten zurück, aber Sie müssen nicht. Um die Verwendung der hasMany machen können Sie es so nennen:

return Vehicle::find($vehicleId); // Retrieve the vehicles from the server 
// the object retrieved has the details. 
$vehicle->details; // then you can use contains the details 

    // example: 
    @foreach($vehicle->details as $details) 
     <a href="page-product-details.html"> 
     <img src="{{ asset("images/$details->imagetitle") }}" 
      alt="{{ $details->title }}" > 
     </a> 
    @endforeach 

Das zurückgegebene Objekt enthält die Details und Sie können es Schleife Trog, wie immer Sie wollen.
Ohne weitere Details darüber, wie Sie die Daten abrufen, kann ich nicht genauer sein.

+0

Eigentlich habe ich versucht '$ popularvehicles = vehicles :: find ($ ad-> Fuelid); Ich habe mehrere Ad Ich musste es in der Schleife laufen. Und es wurden nur die zuletzt zurückgegebenen Daten gespeichert. Also musste ich es in ein Array setzen. Jetzt weiß ich nicht, wie man es zurückholt. – Anon

0

Ich kann 2 Probleme sehen;
Ihr popularvehicles ist ein Array von Arrays

$popularvehicles[]=vehicles::where('id',$ad->Vehicleid)->get()->toArray(); 

Die toArray ist alles in ein Array drehen. Sie haben keine Fahrzeugobjekte mehr. https://laravel.com/docs/5.2/collections#method-toarray

Verwenden Sie stattdessen -> all().

Zweites Problem

@foreach($vehicle->image as $image) 

Sie wollen fahrzeug- $ verwenden> Bild s

+0

Wenn ich all() verwende, wie kann ich Fahrzeuge mit Werbung filtern? – Anon

+0

Sie könnten etwas wie tun; '$ ads = Anzeigen :: orderBy ('views', 'desc') -> get(); // Ruft alle Anzeigen ab '$ vechicles = Fahrzeug :: whereIn ('id', $ ads-> zupfen ('vehcile_id')) -> get();' Das sollte Ihnen alle Fahrzeuge geben, ohne zu tun N + 1 Abfragen. Es gibt andere Abfragen, die Sie auch tun könnten, Laravel hat einen leistungsstarken Abfragegenerator – cosmorogers

+0

Oder anstelle von 'Vehicles :: wo ('ID', $ ad-> VehicleID) -> get() -> toArray();' Sie könnte einfach 'Vehicles :: find ($ ad-> Vehicle id)' 'Nicht nötig für alle() oder toArray(), da Sie nur das eine Fahrzeug pro add retreives sind. – cosmorogers

Verwandte Themen