Laravel, Eloquent и Kyslik сортируют объединенные таблицы? - PullRequest
1 голос
/ 08 января 2020

Я снова застрял. На этот раз с сортировкой ссылок для 3 соединенных таблиц. Я строю свой запрос следующим образом:

...
$query= Interaction::where('interactions.user_id', $id)->where('interactions.active', '1'); 
$query->join('contacts','interactions.contact_id','=','contacts.id');
$query->join('products','interactions.product_id','=','products.id');

$contact_username = request('contact_username');
$contact_name = request('contact_name');
$contact_type = request('contact_type');
$product_name = request('product_name');
$platform = request('platform');
$dateMode = request('dateMode');
$date = request('date');
$completed_at = request('completed_at');
$notesMode = request('notesMode');
$notes = request('notes');

//settings up some filters based on the request:
if ($contact_username) $query->whereJsonContains('contacts.username', $contact_username);
if ($contact_name) $query->where('contacts.name', $contact_name);
if ($contact_type) $query->where('contacts.type', $contact_type);
if ($product_name) $query->where('products.name', $product_name);
if ($platform) $query->where('interactions.platform', $platform);
if ($notes && $notesMode=='+') $query->where('interactions.notes', 'like', "%".$notes."%");
if ($notes && $notesMode=='-') $query->where('interactions.notes', 'not like', "%".$notes."%");
if ($date && $dateMode) $query->whereDate('date', $dateMode, $date);
if ($completed_at && $dateMode) $query->whereDate('completed_at', $dateMode, $completed_at);

//and finally:
$interactions = $query->sortable()->paginate(20,['interactions.*','contacts.username','contacts.name','contacts.type','products.name']);
...

Тогда, на мой взгляд, у меня есть:

<th>@sortablelink('contact.username','Username')</th>
<th>Platform</th>
<th>Type</th>
<th>@sortablelink('contact.name','Name')</th>
<th>@sortablelink('product.name','Product')</th>
<th>@sortablelink('date','Date')</th>
<th>@sortablelink('notes','Notes')</th>

Последние 2 ссылки отлично работают, и все отсортировано в порядке, потому что они из таблицы «Взаимодействия», но ссылки, которые должны сортироваться по столбцам из соединенных таблиц «Продукты» и «Контакты», не работают.

Как правильно ссылаться на эти столбцы в @sortablelink, когда они поступают из соединенных таблиц?

PS: у меня есть два других работающих представления хорошо, когда используются только таблицы «Продукты» и «Контакты», и сортировка для каждого столбца в этих таблицах работает нормально, поэтому я знаю, что модели настроены правильно.

1 Ответ

1 голос
/ 08 января 2020

Решение оказалось довольно простым, но мне пришлось поспать о проблеме и снова заняться этим утром. :) Вместо того, чтобы соединить две другие таблицы вручную, я сделал это следующим образом:

$query= Interaction::where('interactions.user_id', $id)->where('interactions.active', '1')->with(['contact','product']);
//the two JOIN rows that were here were dropped. Everything else stayed the same.

, и я добавил отношения в свою модель "Взаимодействие" следующим образом:

public function product() { return $this->belongsTo(Product::class); }
public function contact() { return $this->belongsTo(Contact::class); }

I надеюсь, что это будет полезно для кого-то. Я потерял много часов, пытаясь понять это прошлой ночью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...