2017-01-24 4 views
0

У меня есть две модели Транспортных средств и изображения, автомобиль hasMany изображенияПолучите значение от одного до многих отношений. Laravel

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

Изображение belongsTo автомобиль:

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

Я извлеченный транспортные средства, как: В контроллере:

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

Вид:

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

Теперь я хочу получить изображение, принадлежащее $ vehicle. Я пробовал следующий синтаксис:

@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 

Но это бросает исключение из: Попытка получить свойство не-объекта. Что я могу сделать, чтобы все исправить?

+0

взглянуть на это. https://laracasts.com/discuss/channels/requests/laravel-issue-in-getting-the-value-of-one-to-many-relationship –

+0

$ popularvehicles [] = транспортные средства :: где ('id' , $ Ad-> Vehicleid) -> с ('изображений') -> получить() -> ToArray(); –

+0

Попробуйте $ vehicle-> images as $ image? – LordMarty

ответ

0

Простой пример:
У вас есть модель, модель имеет детали в другой модели.

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

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

И детали модель:

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

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

} 

Я обычно использую трансформаторы возвращать необходимые данные, но вы не должны. Для того, чтобы использовать hasMany можно назвать так:

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 

Возвращаемый объект содержит информацию, и вы можете корыто цикл его, как вы хотите.
Без дополнительной информации о том, как вы извлекаете данные, я не могу быть более конкретным.

+0

На самом деле я попробовал '$ popularvehicles = vehicles :: find ($ ad-> Vehicleid); У меня есть несколько объявлений, которые я должен был запустить в цикле. И он хранит только последние возвращенные данные. Поэтому мне пришлось положить его в массив. Теперь я не знаю, как его получить. – Anon

0

Я вижу 2 проблемы;
Ваш popularvehicles массив массивов

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

The ToArray превращает все в массив. У вас больше нет объектов транспортного средства. https://laravel.com/docs/5.2/collections#method-toarray

Используйте -> все() вместо этого.

Вторая проблема

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

Вы хотите использовать $ vehicle-> изображение s

+0

Если я использую все(), как я могу фильтровать транспортные средства с рекламой? – Anon

+0

Вы могли бы сделать что-то вроде; '$ ads = Объявления :: orderBy ('views', 'desc') -> get(); // Получает все объявления ' ' $ vechicles = Vehicle :: whereIn ('id', $ ads-> pluck ('vehcile_id')) -> get(); ' Это должно дать вам все вежилки, не делая N + 1 запросов. Есть и другие вопросы, которые вы могли бы сделать, Laravel имеет мощный построитель запросов – cosmorogers

+0

Или вместо 'vehicle :: where ('id', $ ad-> Vehicleid) -> get() -> toArray();' you может просто сделать «Транспортные средства :: find» ($ ad-> Vehicleid); 'Нет необходимости для всех() или toArray(), поскольку вы просто возвращаете одно транспортное средство за каждый добавочный номер. – cosmorogers

Смежные вопросы