<?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>Forem: ludovic dillieux</title>
    <description>The latest articles on Forem by ludovic dillieux (@kioz).</description>
    <link>https://forem.com/kioz</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F954046%2Fb99001a7-00aa-40ad-9c42-3c7835a9c75b.png</url>
      <title>Forem: ludovic dillieux</title>
      <link>https://forem.com/kioz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kioz"/>
    <language>en</language>
    <item>
      <title>The Language Choice Dilemma: Between Pragmatism and Development Joy</title>
      <dc:creator>ludovic dillieux</dc:creator>
      <pubDate>Mon, 08 Sep 2025 19:15:14 +0000</pubDate>
      <link>https://forem.com/kioz/the-language-choice-dilemma-between-pragmatism-and-development-joy-4pl8</link>
      <guid>https://forem.com/kioz/the-language-choice-dilemma-between-pragmatism-and-development-joy-4pl8</guid>
      <description>&lt;p&gt;After several years juggling between PHP, Python, and Java in my career, I find myself facing a reality that many developers know well: the gap between what I use at the office and what I choose for my personal projects. This experience has led me to think deeply about technology choices and what really matters when developing.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Journey: From Professional Java to Personal Laravel
&lt;/h2&gt;

&lt;p&gt;Currently, I work primarily with Java in a professional context. It's a solid language, well-established, with a mature ecosystem and recognized performance. Yet, when it comes time to create my own tools and personal projects, I systematically turn to Laravel and PHP.&lt;/p&gt;

&lt;p&gt;Why this difference? Simply because it's with Laravel that I truly enjoy developing. The elegance of the syntax, the fluidity of the workflow, the richness of the ecosystem... everything contributes to giving me that flow sensation every developer seeks.&lt;/p&gt;

&lt;p&gt;This experience made me realize something important: &lt;strong&gt;pure technique isn't everything&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comfort Before Pure Performance
&lt;/h2&gt;

&lt;p&gt;There's a tendency in our field to always want to choose the "best" language for each task. The most performant, the most modern, the most trendy. But this approach forgets a crucial factor: our own comfort and expertise.&lt;/p&gt;

&lt;p&gt;I'm convinced that it's better to choose a language you're comfortable with, even if it's not theoretically optimal for the task, rather than struggling with a technology you don't master well. Of course, there are limits to this rule — nobody's going to develop a critical embedded system in JavaScript — but in most cases, our ease with the tool matters more than its raw performance.&lt;/p&gt;

&lt;p&gt;A fulfilled and productive developer with their preferred language will often deliver better results than a frustrated developer using the "best" technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoiding Unnecessary Complexity
&lt;/h2&gt;

&lt;p&gt;This philosophy applies particularly when developing alone or in a small team. I've seen too many personal projects or startups get bogged down in over-complex architecture, chosen for its theoretical technical qualities rather than its practicality.&lt;/p&gt;

&lt;p&gt;When you're alone at the helm of a project, simplicity becomes a cardinal virtue. Better a well-structured Laravel monolith than a microservices architecture in Kubernetes if you don't have the time or team to maintain it properly.&lt;/p&gt;

&lt;p&gt;Technical complexity should respond to a real need, not to a desire to write beautiful code or follow the latest trends.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Importance of Joy in Development
&lt;/h2&gt;

&lt;p&gt;The joy of developing isn't a luxury, it's a success factor. When you love what you do, several things happen naturally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You're more creative&lt;/strong&gt;: solutions emerge more easily&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You're more productive&lt;/strong&gt;: code flows naturally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You learn better&lt;/strong&gt;: you spontaneously dig into aspects that intrigue you&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You persevere&lt;/strong&gt;: when facing difficulties, motivation remains intact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's why I recommend choosing your language first by personal affinity, then adapting to specific technical constraints when they really present themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Staying Curious Without Following Every Trend
&lt;/h2&gt;

&lt;p&gt;This doesn't mean you should lock yourself in your comfort zone. Curiosity remains essential in our profession. But there's a difference between discovering new tools out of genuine interest and adopting every novelty out of fear of missing out.&lt;/p&gt;

&lt;p&gt;Take GitHub Actions, which I plan to integrate into my next project. I'm not adopting it because it's trendy, but because it addresses concrete needs: automating deployments, running tests on every commit, managing releases properly...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The key is to stay open to tools that bring concrete value to our workflow&lt;/strong&gt;, not to those that just make noise on Twitter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some Practical Advice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 For Choosing Your Main Language
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Test several languages on small projects&lt;/li&gt;
&lt;li&gt;Observe which one makes you naturally most productive&lt;/li&gt;
&lt;li&gt;Consider the ecosystem and community, not just the syntax&lt;/li&gt;
&lt;li&gt;Don't underestimate the importance of documentation and learning resources&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔍 For Evaluating New Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;First identify a concrete problem in your workflow&lt;/li&gt;
&lt;li&gt;Test the tool on a non-critical project&lt;/li&gt;
&lt;li&gt;Evaluate the learning cost vs. the benefit provided&lt;/li&gt;
&lt;li&gt;Ask yourself if you'll really use this tool in 6 months&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 For Avoiding Over-complexity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start simple, complexify only when necessary&lt;/li&gt;
&lt;li&gt;Favor solutions you know how to maintain&lt;/li&gt;
&lt;li&gt;Document your technical choices to remember why you made them&lt;/li&gt;
&lt;li&gt;Don't be ashamed to use "simple" solutions if they work&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion: Own Your Choices
&lt;/h2&gt;

&lt;p&gt;In the end, there's no perfect choice when it comes to programming languages. There are choices adapted to a context, a team, a project, and especially to a person.&lt;/p&gt;

&lt;p&gt;I completely own my choice of Laravel for my personal projects, even if it's not the most performant or trendy language. It allows me to create quickly and with pleasure, and that's exactly what I need.&lt;/p&gt;

&lt;p&gt;The most important thing is to choose consciously, weighing the real criteria that matter for your situation: your expertise, your constraints, your objectives, and yes, your joy of developing.&lt;/p&gt;

&lt;p&gt;Because at the end of the day, a good developer with their favorite tools will always be worth more than a frustrated developer with the "best" tools.&lt;/p&gt;




&lt;p&gt;What about you? How do you choose your languages and tools? Do you prioritize technical performance or your development comfort? &lt;/p&gt;

&lt;p&gt;Drop a comment below and let's discuss! 👇&lt;/p&gt;

</description>
      <category>programming</category>
      <category>career</category>
      <category>php</category>
      <category>java</category>
    </item>
    <item>
      <title>5 Laravel Migration Mistakes That Cost Me 3 Days (And How You Can Avoid Them)</title>
      <dc:creator>ludovic dillieux</dc:creator>
      <pubDate>Thu, 14 Aug 2025 10:52:32 +0000</pubDate>
      <link>https://forem.com/kioz/5-laravel-migration-mistakes-that-cost-me-3-days-and-how-you-can-avoid-them-1o71</link>
      <guid>https://forem.com/kioz/5-laravel-migration-mistakes-that-cost-me-3-days-and-how-you-can-avoid-them-1o71</guid>
      <description>&lt;p&gt;&lt;em&gt;Learning Laravel while building a real beekeeping app taught me these lessons the hard way.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Last week, I spent &lt;strong&gt;3 frustrating days&lt;/strong&gt; debugging migration issues while building BeeNote, my beekeeping management app. What should have been a simple database setup turned into a PostgreSQL nightmare.&lt;/p&gt;

&lt;p&gt;Here are the 5 mistakes that cost me the most time – and the solutions that finally worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Duplicate Index Trap 🪤
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Mistake:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'photos'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;morphs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'photoable'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'photoable_type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'photoable_id'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// DUPLICATE!&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Error:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQLSTATE[42P07]: Duplicate table: relation "photos_photoable_type_photoable_id_index" already exists
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt;&lt;br&gt;
Laravel’s &lt;code&gt;morphs()&lt;/code&gt; method &lt;strong&gt;automatically creates the index&lt;/strong&gt;. Don’t add it manually.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'photos'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;morphs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'photoable'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Index created automatically&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ordre'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Only additional indexes&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Time saved:&lt;/strong&gt; 4 hours of PostgreSQL debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Wrong Data Types for GPS Coordinates 🗺️
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Mistake:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'latitude'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Precision loss!&lt;/span&gt;
&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'longitude'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Your beehives will "move" 10 meters&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'latitude'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// 47.12345678 - exact precision&lt;/span&gt;
&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'longitude'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// -1.23456789 - no drift&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you’re tracking beehive locations, 10-meter precision errors aren’t acceptable.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Forgetting Business Logic in ENUMs 📝
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Mistake:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'queen_color'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Free text = chaos&lt;/span&gt;
&lt;span class="c1"&gt;// Users input: "blue", "Blue", "BLUE", "bleu", "azul"...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'couleur_marquage_reine'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'blanc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'jaune'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'rouge'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'vert'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'bleu'&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// International beekeeping color code&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real beekeeping uses standardized queen marking colors. Research your domain!&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Performance Killer: Missing Composite Indexes 🐌
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt;&lt;br&gt;
50ms query time on 10k+ records because I didn’t think about real-world usage patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Users frequently filter by: their tasks + status&lt;/span&gt;
&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'statut'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// Composite index&lt;/span&gt;

&lt;span class="c1"&gt;// Query time: 50ms → 2ms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think about your WHERE clauses &lt;strong&gt;before&lt;/strong&gt; you have performance problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Wrong Cascade Strategy = Data Loss 💥
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Mistake:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreignId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'visite_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;constrained&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cascade'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// DESTROYS history!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreignId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'visite_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;constrained&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'set null'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Keeps history, breaks link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a visit gets deleted, I want to keep the task history – just remove the connection.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Learning: Domain Knowledge Matters
&lt;/h2&gt;

&lt;p&gt;Building BeeNote taught me that &lt;strong&gt;migrations aren’t just technical&lt;/strong&gt; – they tell the story of your business logic.&lt;/p&gt;

&lt;p&gt;My visits table has &lt;strong&gt;47 columns&lt;/strong&gt; because beekeeping is complex:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weather conditions affect bee behavior&lt;/li&gt;
&lt;li&gt;Queen marking follows international standards&lt;/li&gt;
&lt;li&gt;Varroa mite counts determine treatment timing&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The technical complexity reflects the real-world complexity.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;These 5 mistakes were just the beginning. I documented the &lt;strong&gt;complete migration journey&lt;/strong&gt; – including the full PostgreSQL schema, performance optimizations, and why I chose VILT stack over TALL stack for this project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://luddev.vercel.app/blog/apprentissage-laravel/migrations-laravel" rel="noopener noreferrer"&gt;Read the full technical deep-dive here&lt;/a&gt;&lt;/strong&gt; (warning: it’s detailed, includes all the code, and explains the beekeeping business logic behind each decision)&lt;/p&gt;

&lt;p&gt;Currently building this in public as I transition from employee to freelance Laravel developer. Following my progress? Find me on &lt;a href="https://x.com/Llieudi" rel="noopener noreferrer"&gt;X/Twitter @Llieudi&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What migration mistakes have cost you the most time? Drop them in the comments – let’s learn from each other’s pain! 😅&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
