2015-01-15 4 views
0

В настоящее время я строил проект/изучал laravel.Представляем данные из двух таблиц laravel

У меня есть две базы данных с одним colomn в обеих таблицах с тем же уникальным значением.

на моей странице лезвия у меня есть Еогеасп, который перебирает в первой таблице, но я не могу понять, как заставить его правильно принести вторые данные таблицы с ним и т.д.

здесь код.

моя модель.

class Restaurant extends Eloquent implements UserInterface, RemindableInterface { 

use UserTrait, RemindableTrait; 

protected $table = 'restaurants'; 

public function reviews() 
{ 
    return $this->hasMany('restaurant_id'); 
} 

Обзоры Модель

class Review extends Eloquent implements UserInterface, RemindableInterface { 

use UserTrait, RemindableTrait; 

/** 
* The database table used by the model. 
* 
* @var string 
*/ 
protected $table = 'reviews'; 


public $review; 

public function reviews() 
{ 
    return $this->hasMany('restaurant_id'); 
} 

лезвие петли Еогеасп

@foreach(array_slice($restaurants, 0, 5) as $restaurants) 

{{$restaurant[0]->restaurant_id}}} 

{{$reviews= Review::find(1)->where('restaurant_id', '=', $restaurant[0]->restaurant_id)->get()}} 

@emdforeach 

контроллер передает данные штраф настолько плохо, что исключает.

я пытаюсь получить соответствующий обзор, чтобы пройти вместе с объектом ресторан и т.д.

какие-либо идеи?

если вы видите какое-либо опечатки оправдания, как я должен был перепечатывать на ноутбук и настольные кодах хорошо :)

UPDATE

Большого спасибо за вашу помощь, после вашего объяснения я понимаю это так, спасибо :)

, тем не менее, когда я пытаюсь это сделать, я пытаюсь получить свойство не-объекта.

Вот обновленный код

Ресторан модель

class Restaurant extends Eloquent implements UserInterface,  RemindableInterface { 

use UserTrait, RemindableTrait; 

/** 
* The database table used by the model. 
* 
* @var string 
*/ 
protected $table = 'restaurants'; 


public $restaurant; 



public function reviews() 
{ 
return $this->hasOne('Review', 'restaurant_id',); 
} 

На мой взгляд

v {{дд ($ restaurants-> Отзывы)}}

это дает мне Пытаюсь для получения свойства не-объекта.

$ рестораны работают отлично не с отзывами?я могу д.д. его и увидеть 5 объектов в массиве

ответ

0

Если у вас есть экземпляр $restaurant, вы можете получить коллекцию его отзывы, как это:

$reviews = $restaurant->reviews; 

Так как это многие ко многим отношения возвращает коллекцию, и теперь вы можете @foreach над этой коллекцией, а также:

@foreach(array_slice($restaurants, 0, 5) as $restaurants) 

    {{ $restaurant[0]->restaurant_id }} 

    @foreach($restaurant->reviews as $review) 
     {{ $review->rating }} 
    @endforeach 

@endforeach 

reviews свойство существует на модели ресторана, так как вы определили этот метод:

public function reviews() 
{ 
    return $this->hasMany('restaurant_id'); 
} 

Доступ к соответствующим свойствам таким же образом аналогичен первому примеру, приведенному в documentation. Если вы хотите посмотреть источник и посмотреть, что происходит, here - это функция, которая вызывается всякий раз, когда вы обращаетесь к свойству модели, которое не определено конкретно в классе (т. Е. Не $fillable или $guarded, но любые атрибуты данных, отношения, доступные как атрибуты, и т. д.).

Если вместо этого вы имели Chef модель и структуру базы данных, где ресторан может иметь много поваров и вы определили этот метод в вашей модели ресторана:

public function chefs() 
{ 
    return $this->hasMany('Chef'); 
} 

Тогда вы могли бы получить список всех поваров в ресторане, как это:

$chefs = $restaurant->chefs; 

вы также можете вызвать метод непосредственно, если, например, вы хотите, чтобы добавить дополнительные ограничения на запрос:

$chefsNamedBob = $restaurant->chefs()->where('name', '=', 'Bob')->get(); 

Обратите внимание, что при вызове этого способа вам также необходимо вызвать ->get() или ->first(), что отличается при попытке получить доступ к отношениям через свойство экземпляра, а не как метод экземпляра. Это связано с тем, что когда вы вызываете метод, запрос еще не выполнен (это то, что делает get()). Когда вы получаете доступ к отношениям как свойству, к моменту получения результатов запрос уже выполняется (это означает, что для SQL не требуется больше времени для фильтрации).

Update

Я также заметил, что у вас есть ошибки в ваших отношениях. Вы определяете свой ресторан, чтобы рассмотреть отношения, как это:

return $this->hasMany('restaurant_id'); 

Первый аргумент функции hasMany является не имя столбца. В целом функция подписи для функции отношений заключается в следующем:

return $this->hasOne('ModelClassName', 'foreign_key', 'local_key'); 

Смотрите documentation для получения дополнительной информации. Если вы следуете красноречивых конвенции (имена множественного числа таблиц, идентификатор как первичный ключ, внешний ключ имена являются правильными), то вы можете использовать ярлык и просто указать имя класса модели:

return $this->belongsToMany('ModelClassName'); 

который является большая причина следовать конвенции.

+0

Большое спасибо за помощь, после вашего объяснения я понимаю это так спасибо :) – user1529597

+0

np, рад помочь. Удачи с вашим проектом! –

+0

, который не работал, даже подумал, что я понял это сейчас. – user1529597

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