2016-03-13 5 views
0

Fundamental misunderstanding of model in Eloquent (Outside of Laravel)Попадая множественные отношения в красноречивых

Мой предыдущий вопрос, который ceejayoz помог мне точку в правильном направлении, но это привело меня к тому, что в основном новый вопрос.

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

1 | 'FISHER'

2 | «BDH»

т.д.

я могу сделать

$company = chemical::find(4)->company; 

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

Как я мог бы получить ассоциированную компанию для всех химических веществ?

$chemicals = company::all()->company; 

Не работает, и я могу понять, почему.

$chemicals = chemical::all(); 

foreach($chemicals as $chem) { 
    echo $chem->company . "<br />"; 
} 

Получит мне ассоциированные компании и это здорово, но потом, когда я иду там с точки зрения всеобъемлющей таблицы?

ответ

1

Вы не указываете, как ваши таблицы company, room и location связаны chemicals. Тем не менее, если они все belongsTo отношения типа, то я верю, что вы ищете Eager Loading:

Eloquent может «нетерпеливые нагрузки» отношения в то время вы запрашиваете родительскую модель. Высокая загрузка уменьшает N + 1 query problem.

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

$chemicals = chemical::with('company', 'room', 'location')->get(); 

Если вы используете шаблонизатор как Twig или лезвие (которые, надеюсь, вы), вы можете передать свой $chemicals непосредственно к шаблону.В противном случае, вы можете перебирать $chemicals как вы продемонстрировали в вашем вопросе:

echo "<table><thead><tr> 
     <th>Chemical ID</th> 
     <th>Chemical Name</th> 
     <th>Company Name</th> 
     <th>Location Name</th> 
     <th>Room Name</th> 
     </tr></thead><tbody>"; 

foreach($chemicals as $chem) { 
    echo "<tr><td>{$chem->id}</td> 
       <td>{$chem->name}</td> 
       <td>{$chem->company->name}</td> 
       <td>{$chem->location->name}</td> 
       <td>{$chem->room->name}</td> 
      </tr>"; 
} 
echo "</tbody></table>"; 

Пожалуйста, обратите внимание, что конвенция в красноречиво капитализировать свои имена классов модели (Chemicals, не chemicals).

+0

ДА. Это именно то, что мне нужно, спасибо вам большое. Я действительно читал эту загружаемую страницу загрузки, но на самом деле она не нажимала на то, что мне было нужно. Я использую Twig, так что это просто вопрос вызова в моей петле chem.company.company. И да, вы, конечно, правильны в отношении капитализации. Я это исправлю. Еще раз спасибо. – danny2327

1

Вопрос немного неясен, но для таблицы химических веществ, которая включает данные своей компании, вы бы сделали что-то в этом направлении. В контроллере:

// we use with() to "eager load" the company data 
// this makes the following line execute two queries 
// without the with(), our Blade template will make a query 
// to the companies table for EVERY row in the table 

// if you have hundreds/thousands of chemicals, you'll 
// want to consider paginate() instead of get() too 

$chemicals = Chemical::with('company')->get(); 

return view('your.view')->withChemicals($chemicals); 

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

<table> 
    @foreach($chemicals as $chemical) 
    <tr> 
     <td>{{ $chemical->name }}</td> 
     <td>{{ $chemical->company->name }}</td> 
    </tr> 
    @endforeach 
</table> 
+0

Это замечательно. Спасибо. Я выбрал другой ответ, потому что он был немного более подробным. +1 для подсказки paginate, так как есть тысячи химических веществ. – danny2327

+0

@ danny2327 Рад, что я мог бы помочь. :-) – ceejayoz

0

Я предполагаю, что вы просили, это:

chemicals: id, company (ENUM), ... 

теперь вы извлекали данные для

companies: id, name (same as ENUM in chemicals previously) 

Если это так, то вы можете сделать 2 вещи:

  1. создать обычные отношения с id и company_id существами ключи и обновите таблицу chemicals, чтобы добавить соответствующие значения company_id в зависимости от их значения company enum/string, а затем падение company. Это может потребовать дополнительных корректировок, например. везде, где вы назвали chemical->company, чтобы получить название компании (становится chemical->company->name)

  2. создать отношения, основанные на chemicals.company и companies.name полей.

Определенно первый вариант лучше в долгосрочной перспективе.

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

  • Нет связанных вопросов^_^