Таблицы: contact
, company
и таблица отношений с пользовательским атрибутом поворота company_contact (company_id, contact_id, is_main)
Компания и контакт имеют много-много отношений (belongsTo
на обеих моделях).
Ожидаемый вывод, когда я получу контакты компании:
{
"data": [
{
"id": 1,
"name": "JohnDoe",
"is_main": false
},
{
"id": 2,
"name": "JaneDoe",
"is_main": true
}
]
}
Ожидаемый результат при получении списка контактов с ?include=companies
:
{
"data": [
{
"id": 1,
"name": "John Doe",
"companies": {
"data": [
{
"id": 501,
"name": "My Company",
"is_main": true
},
{
"id": 745,
"name": "Another Company",
"is_main": false
}
]
}
},
{
"id": 2,
"name": "Jane Doe",
"companies": {
"data": [
{
"id": 999,
"name": "Some Company",
"is_main": true
}
]
}
}
]
}
Каков наилучший способ добавления атрибута сводной таблицы? Это не кажется чистым, чтобы добавить is_main
на преобразователе компании, если атрибут установлен.
Для первого примера я думал об использовании параметров ?include=company_relationship:company_id(1)
с чем-то вроде:
public function includeCompanyRelationship(Contact $contact, ParamBag $params) {
// .. retrieve the pivot table data here
$is_main = $company->is_main;
// but now I would need another transformer, when what I actually want is to push the value on the main array (same level)
return $this->item(??, ??);
}
Я понимаю, как получить сводные данные (связанные: Laravel 5.1 — сводная таблица между тремя таблицами, лучший вариант?) но не лучший способ добавить его в https://github.com/thephpleague/fractal Трансформаторная логика.
У меня уже есть ContactTransformer и CompanyTransformer, но если я добавлю is_main
для CompanyTransformer все звонки, которые я делаю (связанные или не с контактами), также ожидают этого атрибута.
Если я правильно читаю вас, вы можете использовать один CompanyTransformer
справиться ли вы хотите иметь is_main
набор свойств, но только если $contact
параметр передается в его конструктор, что-то вроде этого:
class CompanyTransformer extends TransformerAbstract
{
public function __construct(Contact $contact = null)
{
$this->contact = $contact;
}
public function transform(Company $company)
{
$output = [
'id' => $company->id,
'name' => $company->name,
];
if($this->contact) {
// This step may not be necessary, but I don't think the pivot data
// will be available on the $company object passed in
$company = $this->contacts->find($company->id);
// You may have to cast this to boolean if that is important
$output['is_main'] = $company->pivot->is_main;
}
return $output;
}
}
Тогда в вашем includeCompanyRelationship
просто перейти в новый CompanyTransformer
с параметром:
public function includeCompanyRelationship(Contact $contact)
{
$companies = $contact->companies;
return $this->collection($companies, new CompanyTransformer($contact));
}
Это должно работать, звоните ли вы companies
непосредственно к конечной точке или вызову конечной точки контакта при внедрении данных о взаимоотношениях компании.
Я знаю, что это старше, но я только столкнулся с этой проблемой. Вот как я это решил.
Добавил withPivot
к отношениям, в моем случае category
а также users
,
В CategoryTransformer я определил свой includeUsers
метод:
/**
* Include Users
* @param Category $category
* @return \League\Fractal\Resource\Collection
*/
public function includeUsers(Category $category)
{
# Just Add withPivot Here.
$users = $category->users()->withPivot('role')->get();
return $this->collection($users, new UserTransformer);
}
Тогда в вашем UserTransformer
класс, на transform()
метод:
public function transform($user)
{
return [
'username' => $user['username'],
'lastname' => $user['lastname'],
// ... truncated
'role' => isset($user['pivot']) ? $user['pivot']['role'] : null,
]
}
Затем, когда я вызываю мой API для categories
и включать users
Я получил:
{
"data": [
{
"name": "Network",
"description": "some description of category here.",
"users": {
"data": [
{
"id": 1,
"username": "jborne",
"firstname": "Jason",
"lastname": "Borne",
"title": "Department Head",
"company": "Borne Inc",
"email": "[email protected]",
"display_name": "Jason Borne",
"mobile": "555-5555",
"active": true,
"role": "IM",
}
]
}
}
]
}
Как видите, я получаю role
отношения, которые я хотел от опоры. В противном случае вы просто получите null
для этого поля. Все еще не идеал, но намного менее грязный по моему мнению.