RobJR
1 month ago

updateOrCreate tries to update non existing column

Posted 1 month ago by RobJR

Hi, I recent been through the 'Laravel from Scratch' series and starting building a website as practice, it is basically a housebuilder type website. I added a feature where logged in users can shortlist properties by favouriting them and I got this working. But, then I found I incorrectly named a database column, so renamed all references to that column and now it has broken. Nothing is being added to the database.

The 'updateOrCreate' method seems to be still referencing the old name of the column and not the new name. I renamed the references from housetype_id to plot_id then rolled back and migrated. This is pretty much following the 'Tweety' app from the series for liking and disliking tweets.

I feel like I'm missing something, perhaps plainly obvious.

Error

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'shortlists.housetype_id' in 'where clause' (SQL: select * from `shortlists` where `shortlists`.`housetype_id` = 16 and `shortlists`.`housetype_id` is not null and (`user_id` = 1) limit 1)

Migrations

public function up()
    {
        Schema::create('shortlists', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained()->onDelete('cascade');
            $table->foreignId('plot_id')->constrained()->onDelete('cascade');
            $table->boolean('shortlisted');
            $table->timestamps();

            $table->unique(['user_id', 'plot_id']);
        });
    }
public function up()
    {
        Schema::create('housetypes', function (Blueprint $table) {
            $table->id();
            $table->string('development');
            $table->string('housetype');
            $table->string('slug');
            $table->unsignedInteger('bedrooms');
            $table->string('abbr', 3);
            $table->string('description');
            $table->text('fulldescription');
            $table->string('type');
            $table->boolean('affordable_status')->default(0);
            $table->string('colour', 6);
            $table->timestamps();
        });
    }
public function up()
    {
        Schema::create('plots', function (Blueprint $table) {
            $table->id();
            $table->string('development');
            $table->integer('plot');
            $table->string('housetype');
            $table->float('price', 8, 2);
            $table->timestamps();
        });
    }

Methods (shortlisted.php)

<?php

namespace App;

use Illuminate\Database\Eloquent\Builder;

trait Shortlisted {

    public function isLikedBy(User $user) {
        return (bool) $user->likes->where('plot_id', $this->id)->where('shortlisted', true)->count();
    }

    public function dislike($user = null) {
        return $this->like($user, false);
    }

    public function likes() {
        return $this->hasMany(Shortlist::class);
    }

    public function like($user = null, $liked = true) {
        $this->likes()->updateOrCreate([
            'user_id' => $user ? $user->id : auth()->id(),
        ], [
            'shortlisted' => $liked
        ]);
    }
}

Class

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Shortlist extends Model {

    protected $guarded = [];

}

Please sign in or create an account to participate in this conversation.