<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Zonvoir Technologies Pvt Ltd</title>
    <description>The latest articles on DEV Community by Zonvoir Technologies Pvt Ltd (@zonvoir_technologiespvt).</description>
    <link>https://dev.to/zonvoir_technologiespvt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4171334%2F457b58ca-3483-4366-a2cd-025a5fa09876.png</url>
      <title>DEV Community: Zonvoir Technologies Pvt Ltd</title>
      <link>https://dev.to/zonvoir_technologiespvt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zonvoir_technologiespvt"/>
    <language>en</language>
    <item>
      <title>Building a Laravel-First Data Table with Inertia.js and Vue 3</title>
      <dc:creator>Zonvoir Technologies Pvt Ltd</dc:creator>
      <pubDate>Thu, 08 Oct 2026 12:40:11 +0000</pubDate>
      <link>https://dev.to/zonvoir_technologiespvt/building-a-laravel-first-data-table-with-inertiajs-and-vue-3-10a3</link>
      <guid>https://dev.to/zonvoir_technologiespvt/building-a-laravel-first-data-table-with-inertiajs-and-vue-3-10a3</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;How we approached server-side tables, searching, sorting, pagination, actions, and table state without duplicating logic between Laravel and Vue.&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you've built a Laravel application with Inertia.js and Vue, you've probably built a data table more than once.&lt;br&gt;
At first, it looks simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get some records&lt;/li&gt;
&lt;li&gt;Display them in Vue&lt;/li&gt;
&lt;li&gt;Add pagination&lt;/li&gt;
&lt;li&gt;Add sorting&lt;/li&gt;
&lt;li&gt;Add search
Then the requirements start growing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need column visibility, row actions, bulk actions, exports, URL state, different column types, relationship data, and more.&lt;/p&gt;

&lt;p&gt;At that point, the table becomes a small application of its own.&lt;/p&gt;

&lt;p&gt;We ran into this repeatedly while building SaaS applications, CRM systems, admin panels, and internal tools at &lt;strong&gt;Zonvoir Technologies.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So we started working on a different approach with &lt;strong&gt;Zonvoir Table.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: Laravel stays in control
&lt;/h2&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;p&gt;Our main goal was to keep the table definition and query logic close to Laravel while allowing Vue to focus on rendering and user interaction.&lt;/p&gt;

&lt;p&gt;The basic flow looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Laravel Table Class → Query → Table Payload → Inertia → Vue Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of putting all of the table logic into the Vue component, the Laravel side defines things such as the columns, query and table configuration.&lt;br&gt;
Vue receives the resulting data and takes care of the UI.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
class UsersTable extends ZonTable&lt;br&gt;
{&lt;br&gt;
    protected function query()&lt;br&gt;
    {&lt;br&gt;
        return User::query();&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;protected function columns()
{
    return [
        TextColumn::make('name'),
        TextColumn::make('email'),
        DateColumn::make('created_at'),
    ];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;The exact API is still evolving, but the principle is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep the data and query concerns close to Laravel. Keep presentation and interaction in Vue.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Inertia.js?
&lt;/h2&gt;

&lt;p&gt;**&lt;br&gt;
Inertia gives us a nice middle ground.&lt;/p&gt;

&lt;p&gt;We don't need to build a separate API just to power an admin table, but we can still build the interface using Vue.&lt;/p&gt;

&lt;p&gt;That means Laravel can continue handling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eloquent queries&lt;/li&gt;
&lt;li&gt;Authorization&lt;/li&gt;
&lt;li&gt;Server-side searching&lt;/li&gt;
&lt;li&gt;Sorting&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Data preparation
While Vue handles:&lt;/li&gt;
&lt;li&gt;Rendering&lt;/li&gt;
&lt;li&gt;Interactions&lt;/li&gt;
&lt;li&gt;Column visibility&lt;/li&gt;
&lt;li&gt;Table controls&lt;/li&gt;
&lt;li&gt;UI state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation makes the table easier to reuse across different applications.&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  What we're currently working on
&lt;/h2&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;p&gt;The current Vue version of Zonvoir Table includes features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Laravel table classes&lt;/li&gt;
&lt;li&gt;Vue 3&lt;/li&gt;
&lt;li&gt;Inertia.js&lt;/li&gt;
&lt;li&gt;Searching&lt;/li&gt;
&lt;li&gt;Sorting&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Typed columns&lt;/li&gt;
&lt;li&gt;Column visibility&lt;/li&gt;
&lt;li&gt;Row actions&lt;/li&gt;
&lt;li&gt;Bulk actions&lt;/li&gt;
&lt;li&gt;Excel exports&lt;/li&gt;
&lt;li&gt;URL-synced state&lt;/li&gt;
&lt;li&gt;Multiple tables&lt;/li&gt;
&lt;li&gt;Customizable UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're focusing on the &lt;strong&gt;Laravel + Inertia.js + Vue 3&lt;/strong&gt; ecosystem first.&lt;br&gt;
**&lt;/p&gt;

&lt;h2&gt;
  
  
  We don't want to reinvent every table feature
&lt;/h2&gt;

&lt;p&gt;**&lt;br&gt;
There are already some excellent table solutions available.&lt;/p&gt;

&lt;p&gt;Depending on your stack, you might be using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TanStack Table&lt;/li&gt;
&lt;li&gt;PrimeVue DataTable&lt;/li&gt;
&lt;li&gt;DataTables&lt;/li&gt;
&lt;li&gt;Filament Tables&lt;/li&gt;
&lt;li&gt;Inertia Table&lt;/li&gt;
&lt;li&gt;A custom table component&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each approach has its own strengths.&lt;br&gt;
Our goal isn't to say that one solution is right for everyone.&lt;br&gt;
We're trying to solve a more specific problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would a good Laravel-first data table look like for applications built with Inertia.js and Vue?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the question we're exploring with Zonvoir Table.&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  We'd like your feedback
&lt;/h2&gt;

&lt;p&gt;**&lt;br&gt;
We're still actively developing the package, so we're particularly interested in hearing from Laravel and Vue developers.&lt;/p&gt;

&lt;p&gt;What do you expect from a data table package?&lt;br&gt;
What features do you use every day?&lt;br&gt;
And if you've moved from one table library to another, &lt;strong&gt;what made you switch?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can take a look at the project here:&lt;br&gt;
Website: &lt;a href="https://zonvoir-table.com/" rel="noopener noreferrer"&gt;https://zonvoir-table.com/&lt;/a&gt;&lt;br&gt;
Documentation: &lt;a href="https://zonvoir-table.com/getting-started/introduction/" rel="noopener noreferrer"&gt;https://zonvoir-table.com/getting-started/introduction/&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/Zonvoir-technologies/laravel-inertia-table" rel="noopener noreferrer"&gt;https://github.com/Zonvoir-technologies/laravel-inertia-table&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>interiajs</category>
      <category>vue</category>
    </item>
  </channel>
</rss>
