Ларавель, красноречивый и Кислик сортируют соединившиеся столы?

Ларавель, красноречивый и Кислик сортируют соединившиеся столы?

08.01.2020 12:35:43 Просмотров 39 Источник

Я опять застрял. На этот раз с сортировкой ссылок для 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: у меня есть два других представления, которые прекрасно работают, когда используются только таблицы "продукты" и "контакты", и сортировка для каждого столбца в этих таблицах работает нормально, поэтому я знаю, что модели настроены правильно.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59636401/laravel-eloquent-and-kyslik-sorting-joined-tables#comment105448075_59636401
Спасибо, Кислик. Я просто прошелся по рабочему примеру в пакете и придумал способ заставить его работать! :) Я опубликую свое решение ниже через несколько минут. Спасибо за отличный пакет!!!
https://stackoverflow.com/questions/59636401/laravel-eloquent-and-kyslik-sorting-joined-tables#comment105451498_59636401
Для фильтрации вы можете найти github.com/Kyslik/laravel-filterable полезно :)

Ответы - Ларавель, красноречивый и Кислик сортируют соединившиеся столы? / Laravel, Eloquent and Kyslik sorting joined tables?

Kalo

08.01.2020 01:11:24

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

$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); }

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

Закрыть X