Laravel: объединить две таблицы, получить информацию из первой таблицы и получить первое связанное изображение из второй таблицы.

У меня есть две таблицы: одна propertyDetails, а другая propertyImages, и я установил связь между двумя таблицами так.

вот модели

Сведения о свойствах

class PropertyDetail extends \Eloquent {
    protected $fillable = [];

    public function propImages()
    {
        return $this->hasMany('PropertyImage', 'property_details_id');
    }
}

Перенос таблиц

public function up()
    {
        Schema::create('property_details', function (Blueprint $table) {
            $table->increments('id');
            $table->enum('purpose', array('Sell', 'Rent'));
            $table->integer('property_owner_id')->unsigned();
            $table->integer('property_agent_id')->nullable();
            $table->integer('bedroom');
            $table->integer('dining_room');
            $table->integer('bathroom');
            $table->string('title', 100);
            $table->integer('price');
            $table->string('type', 120);
            $table->string('specify_type', 120);
            $table->text('details');
            $table->integer('active');
            $table->foreign('property_owner_id')->references('id')->on('property_owners')->onDelete('cascade');
            $table->timestamps();
        });
    }

PropertyImages

class PropertyImage extends \Eloquent
{
    protected $fillable = [];

    public function propertyImages()
    {
        return $this->belongsTo('PropertyDetail', 'property_details_id');
    }
}

Перенос таблиц

Schema::create('property_images', function(Blueprint $table)
        {
            $table->increments('id');
            $table->integer('property_details_id')->unsigned();
            $table->foreign('property_details_id')->references('id')->on('property_details')->onDelete('cascade');
            $table->binary('image');
            $table->timestamps();
        });
    }

что я хочу сделать, это выбрать все projectsDetails с первым связанным изображением из таблицы два propertyImages

Я старался

$properties = PropertyDetail::with('propImages')->get();
return View::make('admin.properties.view', compact('properties'));

и на мой взгляд

@foreach($properties as $property)
{{ HTML::image('images/propertyImages/'.$property->propImages->image, $property->title, array('width'=>767, 'height'=>384)) }}
@endforeach

есть

Неопределенное свойство: Illuminate\Database\Eloquent\Collection::$image


person Yousef Altaf    schedule 14.12.2016    source источник


Ответы (3)


Как говорится в ошибке, вы пытаетесь получить отношение к коллекции, отношение существует к объектам (записям) в этой коллекции. Вам нужно пройтись по свойствам и для каждого получить свои элементы...

 @foreach ($properties as $property)
  // access property properties here
  @foreach ($property->image as $image)
    // access image properties here.
  @endforeach
@endforeach
person Ferran    schedule 14.12.2016
comment
хорошо, что вы правильно поняли мою проблему, но напоследок мне нужно получить первое изображение, но не все - person Yousef Altaf; 14.12.2016
comment
Вы можете изменить свой -›get() на -›first() - person Ferran; 14.12.2016
comment
Я так не думаю, потому что я запрашиваю properties, а не images вопрос в том, как тормозить после первого цикла изображений - person Yousef Altaf; 14.12.2016

Измените эту строку:

return View::make('admin.properties.view', compact('properties'));

to

return View::make('admin.properties.view', ['properties' => $properties]));

и попробуй еще раз.

Примечание. Второй аргумент, передаваемый View::make, — это массив данных, которые должны быть доступны для представления.

Справочник

person Mayank Pandeyz    schedule 14.12.2016
comment
Mayank Pandeyz то же самое, отметив, что изменилась та же ошибка, я просто попробовал это $properties = PropertyDetail::with(['propImages' => function($query){ $query->where('property_details_id', 'id'); }])->get(); и все те же результаты - person Yousef Altaf; 14.12.2016
comment
по поводу примечания: мое мнение выглядит так @foreach($properties as $property) {{ HTML::image('images/propertyImages/'.$property->propImages->image, $property->title, array('width'=>767, 'height'=>384)) }} @endforeach - person Yousef Altaf; 14.12.2016

Спасибо за все, вот как я заставил это работать

в разделе просмотра, как предложил @Ferran, я сделал это

@foreach ($properties as $property)
  // access property properties here
  @foreach ($property->image as $image)
    // access image properties here.
  @endforeach
@endforeach

но поскольку мне нужно только первое изображение, а не все, я нашел решение здесь

Я только что изменил второй @foreach на slice вот окончательный код

@foreach ($properties as $property)
      // access property properties here
      @foreach($property->propImages->slice(0, 1) as $image)
        // access image properties here.
      @endforeach
    @endforeach
person Yousef Altaf    schedule 14.12.2016