2016-03-14 3 views
1

Если у меня есть properties стол и 2 другие таблицы:Получить указанную запись из belongsToMany отношения Laravel

*property_characteristics 
    - property_id (i.e. 1) 
    - characteristic_id (i.e. 5 - join with default_characteristics) 
    - value (i.e. 3 - aka 3 rooms) 
*default_characteristics 
    - id (i.e. 5) 
    - name (i.e. rooms) 

В модели Property.php у меня есть:

public function characteristics() 
{ 
return $this->belongsToMany('Proactiv\DefaultCharacteristic', 'property_characteristics', 'property_id', 'characteristic_id'); 
} 

Как я могу получить номер (стоимость от свойств собственности) для имущества, начиная с:

$property = Properties::find(1); 

Я бы не стал что-то вроде этого в поле зрения:

$property->characteristics->rooms // should return 3 which is the value columns on property_characteristics table 

ответ

2

Поскольку значение находится на вашей сводной таблице, вам нужно сообщить Laravel об этом дополнительном поле. Добавить в вашей belongsToMany линии сделать:

return $this->belongsToMany('Proactiv\DefaultCharacteristic', 'property_characteristics', 'property_id', 'characteristic_id') 
    ->withPivot('value'); 

Затем выберите характеристики с именем, которое вы хотите, rooms и получить значение:

echo $property->characteristics()->with('name', 'rooms')->first()->pivot->value; 

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

public function getRoomsAttribute() 
{ 
    return $this->characteristics() 
     ->where('name', 'rooms') 
     ->first() 
     ->pivot 
     ->value; 
} 

Затем вы можете получить номер номера так же, как вы хотели, с $property->rooms.

Или вы могли бы обобщить это, чтобы получить любую характеристику:

public function getCharacteristic($name) 
{ 
    return $this->characteristics() 
     ->where('name', $name) 
     ->first() 
     ->pivot 
     ->value; 
} 

А затем получить количество номеров с $property->getCharacteristic('rooms').

+0

Я использовал 'getCharacteristic', потому что у меня есть динамические фильтры. Спасибо. –

+0

Еще одно замечание, что я использовал 'first()' в своем ответе. Я не знаю, есть ли у вас две характерные записи для одного и того же свойства с тем же именем, но если это так, вы получите только один из них. – tremby

+0

Другое дело, если вы не * всегда * хотите получить сводные данные 'value', вы можете переместить вызов' withPivot' в метод 'getCharacteristic'. Затем он будет применяться только к запросам, генерируемым этим методом. – tremby

0

Во-первых, вы должны сообщить свои отношения, чтобы сделать свое дополнительное поле доступным. Вы можете сделать это с помощью метода withPivot():

public function characteristics() { 
    return $this->belongsToMany('Proactiv\DefaultCharacteristic', 'property_characteristics', 'property_id', 'characteristic_id') 
     ->withPivot('value'); 
} 

Теперь вы можете получить доступ к стоимости на сводной таблице. Вы можете сделать это следующим образом:

$property = Properties::find(1); 

foreach ($property->characteristics as $characteristic) { 
    echo $characteristic->pivot->value; 
} 

Вы можете прочитать об этом в documentation here под Получение Intermediate столбцов таблицы заголовка.

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