Before starting the Laravel 12 install process, ensure you meet the following Laravel 12 requirements:
Model casts now allow you to specify default values directly inside the cast array.
Laravel 11 - Old Way
class User extends Model
{
protected $casts = [
'is_active' => 'boolean',
];
protected $attributes = [
'is_active' => true, // Set default separately
];
}
Laravel 12 - New Way
class User extends Model
{
protected $casts = [
'is_active' => 'boolean:default(true)',
];
}
Now auto-detects the model using route model binding.
Laravel 11 - Old Way
class PostController extends Controller
{
public function __construct()
{
$this->authorizeResource(Post::class, 'post');
}
}
Laravel 12 - New Way
class PostController extends Controller
{
public function __construct()
{
$this->authorizeResource();
}
}
(It figures out you are using Post model from the controller name!)
A new method to atomically insert or update data.
Laravel 11 - Old Way
User::updateOrInsert(
['email' => 'example@example.com'],
['name' => 'Updated Name']
);
Laravel 12 - New Way
User::upsertOrInsert(
['email' => 'example@example.com'],
['name' => 'Updated Name']
);
(Clearer intention, internally optimized)
Shorter and cleaner syntax for form attributes.
Laravel 11 - Old Way
<input type="checkbox" name="active" {{ old('active', false) ? 'checked' : '' }}>
Laravel 12 - New Way
<input type="checkbox" name="active" @checked(old('active', false))>
<input type="text" name="name" @readonly($user->is_guest)>
<input type="submit" value="Save" @disabled(!$user->can_edit)>
(Super clean and readable!)
Adds a condition only when the value is not empty.
Laravel 11 - Old Way
$query = User::query();
if (!empty($request->email)) {
$query->where('email', $request->email);
}
Laravel 12 - New Way
$query = User::query()
->whenFilled('email', $request->email);
Laravel 12 detects unique keys automatically during upsert().
Laravel 11 - Old Way
User::upsert([
['email' => 'one@example.com', 'name' => 'One'],
['email' => 'two@example.com', 'name' => 'Two'],
], ['email']); // You must mention 'email' key manually
Laravel 12 - New Way
User::upsert([
['email' => 'one@example.com', 'name' => 'One'],
['email' => 'two@example.com', 'name' => 'Two'],
]);
(If your table already has a unique index on email, Laravel knows to use it!)
Efficiently load large datasets in reverse order.
User::lazyByIdDesc()->each(function ($user) {
// Process each user
});
Use MissingValue to skip null fields in API resources.
use Illuminate\Http\Resources\MissingValue;
public function toArray($request)
{
return [
'name' => $this->name,
'profile_photo' => $this->profile_photo ?? new MissingValue(),
];
}