2015-10-20 2 views
0

Я пытаюсь получить связанные «связанные» модели, запросив таблицу ссылок, названную company_projects, которая содержит (как вы ожидаете) идентификаторы компаний и проектов (проекты являются категориями продуктов).получить * связанные * связанные модели в laravel eloquent вместо необработанного SQL

В этом случае используется поток для определения соответствующего проекта является:

  1. Получить компании, которые находятся в же проекте («категория продукта»), как вы
  2. Найти другого проект идентификаторы, которые связаны с этими компаниями
  3. Получить информации о связанных проектах сгружена последним шагом


Что я пытаюсь сделать, это уже функционирующий в следующем сырым запроса:

SELECT 
    * 
FROM 
    projects 
WHERE 
    projects.id IN 
    (
     SELECT cp1.project_id 
     FROM company_projects cp1 
     WHERE cp1.company_id IN 
     (
      SELECT cp1.company_id 
      FROM projects p 
      LEFT JOIN company_projects cp2 ON cp2.project_id = p.id 
      WHERE p.id = X AND cp2.company_id != Y 
     ) 
    ) 
    AND projects.id != X 

X = идентификатор текущего проекта ('категория продукта')
Y = ID от текущего «пользователя» (компании)


Но мой реальный вопрос: как это сделать элегантно в Laravel Rloquent (в настоящее время v4.2). Я попробовал это, но я не везёт до сих пор ...

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

ответ

0

Для этого вам необходимо использовать Eloquent relationships. (Обратите внимание, что я привязываюсь к документам 4.2, так как это то, что вы используете, но я настоятельно рекомендую модернизировать Laravel до 5.1).

Я предполагаю, что у вас уже есть модель «Компания» и «Проект». Внутри каждой из этих моделей вам нужно определить метод, который ссылается на его отношение к другой модели. Основываясь на вашем описании, похоже, что у двух есть отношения Many to Many, что означает, что у компании может быть много проектов, а проект также может принадлежать многим компаниям. У вас уже есть таблица базы данных, связывающая их. В Eloquent ORM эта таблица ссылок называется сводной таблицей. Когда вы определяете свои отношения в модели, вам необходимо передать имя этой сводной таблицы в качестве второго аргумента. Вот как он может вас искать.

модель Компания:

class Company extends Model 
{ 
    /** 
    * Get the projects attached to a Comapny. Many To Many relationship. 
    */ 
    public function projects() 
    { 
     return $this->belongsToMany('Project','company_projects'); 
    } 
} 

модель проекта:

class Project extends Model 
{ 
    /** 
    * Get the companies this project belongs to. Many To Many relationship. 
    */ 
    public function companies() 
    { 
     return $this->belongsToMany('Company','company_projects'); 
    } 
} 

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

$company = Company::find(1234); 
$projects = $company->projects; 

Даже лучше, вы можете использовать то, что называется eager loading, что уменьшит ваши данные поиск в одной строке (это в основном полезно при передаче данных в представлениях, и вы будете перебирать связанные модели в представлении). Таким образом, вышеуказанные заявления можно было бы переписать как:

$company = Company::with('projects')->find(123); 

Это вернет модель вашей компании со всеми связанными с ней продуктами в качестве собственности. Обратите внимание, что нетерпевая загрузка может быть даже вложенной с точечной нотацией. Это означает, что вы можете найти все модели, которые ссылаются на вашу основную модель, а затем все модели для тех моделей и т. Д. И так далее.

Учитывая все это, давайте посмотрим, чего вы конкретно хотите достичь.

Предположим, что этот метод встречается в контроллере, которому передается идентификатор проекта из маршрута.

public function showCompaniesAndProjects($id) 
{ 
    //Get all companies in the same project as you 
    //Use eager loading to grab the projects of all THOSE companies 
    //Result will be a Project Object with all Companies 
    //(and those projects) as Eloquent Collection 
    $companies = Project::with('companies.projects')->find($id); 

    //do something with that data, maybe pass it to a view 
    return view('companiesView')->with('companies',$companies); 
} 

После определения ваших отношений в моделях вы можете выполнить весь этот запрос в одной строке.

+0

Благодарим вас за ответ, но, возможно, я должен был объяснить, что знаю об использовании Модели и Красноречивости в Laravel (и некоторых опытах в 5.1). Но реальный вопрос заключался в том, как преобразовать этот специфицированный запрос в синтаксис красноречия, поскольку я этого не сделал. – Dominique

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