| Value of variable ($var) | isset($var) | empty($var) | is_null($var) |
|---|---|---|---|
| “” (an empty string) | bool(true) | bool(true) | |
| ” ” (space) | bool(true) | ||
| FALSE | bool(true) | bool(true) | |
| TRUE | bool(true) | ||
| array() (an empty array) | bool(true) | bool(true) | |
| NULL | bool(true) | bool(true) | |
| “0” (0 as a string) | bool(true) | bool(true) | |
| 0 (0 as an integer) | bool(true) | bool(true) | |
| 0.0 (0 as a float) | bool(true) | bool(true) | |
| var $var; (a variable declared, but without a value) | bool(true) | bool(true) | |
| NULL byte (“\ 0”) | bool(true) |
Sunday, December 1, 2019
PHP isset() vs empty() vs is_null()
Monday, November 25, 2019
How to deploy a React application to Firebase
After we built a full-fledged Firebase application in React, the final step is deployment, the tipping point of getting your ideas out into the world, from consuming tutorials to producing applications. Since you have already used Firebase extensively for your application, why not choosing Firebase Hosting for the deployment?
In this section, I want to guide you through deploying your React application to Firebase. It works for create-react-app too. Also it should work for any other library and framework such as Angular or Vue. First, install the Firebase CLI globally to your node modules:
npm install -g firebase-tools
Using a global installation of the Firebase CLI, you can deploy any application without worrying about the dependency in your project. For any global installed node package, remember to update it occasionally to a newer version with the identical command:
npm install -g firebase-tools
Next associate the Firebase CLI with a Firebase account (Google account):
firebase login
There should be a URL in your command line that opens in a browser. If this doesn't happen, Firebase CLI may open up the URL automatically. Choose your Google account you used earlier to create a Firebase project, and give Google the necessary permissions. You should see a confirmation for a successful setup. Return to the command line to verify a successful login.
Next, move to the project's folder and execute the following command, which initializes a Firebase project that can be used for the Firebase hosting features:
firebase init
Then, choose the Hosting option. If you are interested in using another tool to host your Firebase application, choose another option:
? Which Firebase CLI features do you want to setup for this folder? Press Space to select features, then Enter to confirm your choices.◯ Database: Deploy Firebase Realtime Database Rules◯ Firestore: Deploy rules and create indexes for Firestore◯ Functions: Configure and deploy Cloud Functions❯◯ Hosting: Configure and deploy Firebase Hosting sites◯ Storage: Deploy Cloud Storage security rules
Since Google knows about Firebase projects associated with your account after logged in, you are able to select your Firebase project from a list of projects from the Firebase platform:
First, let's associate this project directory with a Firebase project.You can create multiple project aliases by running firebase use --add,but for now we'll just set up a default project.? Select a default Firebase project for this directory:-> react-firebase-authentic-d12f8 (react-firebase-authentication)i Using project react-firebase-authentic-d12f8 (react-firebase-authentication)
There are a few other configuration steps to define. Instead of using the default public/ folder, we want to use the build/ folder for create-react-app. If you set up the bundling with a tool like Webpack, you can choose the appropriate name for the build folder:
? What do you want to use as your public directory? build? Configure as a single-page app (rewrite all urls to /index.html)? Yes? File public/index.html already exists. Overwrite? No
The create-react-app application creates a build/ folder after you perform the
npm run build for the first time. There you will find all the merged content from the public/ folder and the src/ folder. Since it is a single page application, we want to redirect the user always to the index.html file. From there React Router takes over for the client-side routing.
Now your Firebase initialization is complete. This step created a few configuration files for Firebase Hosting in your project's folder. You can read more about them in Firebase's documentation for configuring redirects, a 404 page, or headers. Finally, deploy your React application with Firebase on the command line:
firebase deploy
After a successful deployment, you should see a similar output with your project's identifier:
Project Console: https://console.firebase.google.com/project/react-firebase-authentic-d12f8/overviewHosting URL: https://react-firebase-authentic-d12f8.firebaseapp.com
Visit both pages to observe the results. The former link navigates to your Firebase project's dashboard. There, you should have a new panel for the Firebase Hosting. The latter link navigates to your deployed React application.
If you only see a blank page for your deployed React application, see if the
public key/value pair in the firebase.json is set to build. That's the case if your build folder has the name build. If it has another name, set the value to this. Second, check if you have ran the build script of your React app with npm run build. After you have done both steps, try another deployment with firebase deploy. That should get your recent React build up and running for Firebase Hosting.Laravel : 20 Laravel Eloquent Tips and Tricks
Eloquent ORM seems like a simple mechanism, but under the hood, there’s a lot of semi-hidden functions and less-known ways to achieve more with it. In this article, I will show you a few tricks.
1. Increments and Decrements
Instead of this:
$article = Article::find($article_id);
$article->read_count++;
$article->save();
You can do this:
$article = Article::find($article_id);
$article->increment('read_count');
Also these will work:
Article::find($article_id)->increment('read_count');
Article::find($article_id)->increment('read_count', 10); // +10
Product::find($produce_id)->decrement('stock'); // -1
2. XorY methods
Eloquent has quite a few functions that combine two methods, like “please do X, otherwise do Y”.
Example 1 –
findOrFail():
Instead of:
$user = User::find($id);
if (!$user) { abort (404); }
Do this:
$user = User::findOrFail($id);
Example 2 –
firstOrCreate():
Instead of:
$user = User::where('email', $email)->first();
if (!$user) {
User::create([
'email' => $email
]);
}
Do just this:
$user = User::firstOrCreate(['email' => $email]);
3. Model boot() method
There is a magical place called
boot() in an Eloquent model where you can override default behavior:class User extends Model
{
public static function boot()
{
parent::boot();
static::updating(function($model)
{
// do some logging
// override some property like $model->something = transform($something);
});
}
}
Probably one of the most popular examples is setting some field value at the moment of creating the model object. Let’s say you want to generate UUID field at that moment.
public static function boot()
{
parent::boot();
self::creating(function ($model) {
$model->uuid = (string)Uuid::generate();
});
}
4. Relationship with conditions and ordering
This is a typical way to define relationship:
public function users() {
return $this->hasMany('App\User');
}
But did you know that at this point we can already add
For example, if you want a specific relationship for some type of users, also ordered by email, you can do this:
where or orderBy?For example, if you want a specific relationship for some type of users, also ordered by email, you can do this:
public function approvedUsers() {
return $this->hasMany('App\User')->where('approved', 1)->orderBy('email');
}
5. Model properties: timestamps, appends etc.
There are a few “parameters” of an Eloquent model, in the form of properties of that class. The most popular ones are probably these:
class User extends Model {
protected $table = 'users';
protected $fillable = ['email', 'password']; // which fields can be filled with User::create()
protected $dates = ['created_at', 'deleted_at']; // which fields will be Carbon-ized
protected $appends = ['field1', 'field2']; // additional values returned in JSON
}
But wait, there’s more:
protected $primaryKey = 'uuid'; // it doesn't have to be "id"
public $incrementing = false; // and it doesn't even have to be auto-incrementing!
protected $perPage = 25; // Yes, you can override pagination count PER MODEL (default 15)
const CREATED_AT = 'created_at';
const UPDATED_AT = 'updated_at'; // Yes, even those names can be overridden
public $timestamps = false; // or even not used at all
And there’s even more, I’ve listed the most interesting ones, for more please check out the code of default abstract Model class and check out all the traits used.
6. Find multiple entries
Everyone knows the
find() method, right?$user = User::find(1);
I’m quite surprised how few people know about that it can accept multiple IDs as an array:
$users = User::find([1,2,3]);
7. WhereX
There’s an elegant way to turn this:
$users = User::where('approved', 1)->get();
Into this:
$users = User::whereApproved(1)->get();
Yes, you can change the name of any field and append it as a suffix to “where” and it will work by magic.
Also, there are some pre-defined methods in Eloquent, related to date/time:
User::whereDate('created_at', date('Y-m-d'));
User::whereDay('created_at', date('d'));
User::whereMonth('created_at', date('m'));
User::whereYear('created_at', date('Y'));
8. Order by relationship
A little more complicated “trick”. What if you have forum topics but want to order them by latest post? Pretty common requirement in forums with last updated topics on the top, right?
First, describe a separate relationship for the latest post on the topic:
public function latestPost()
{
return $this->hasOne(\App\Post::class)->latest();
}
And then, in our controller, we can do this “magic”:
$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');
9. Eloquent::when() – no more if-else’s
Many of us write conditional queries with “if-else”, something like this:
if (request('filter_by') == 'likes') {
$query->where('likes', '>', request('likes_amount', 0));
}
if (request('filter_by') == 'date') {
$query->orderBy('created_at', request('ordering_rule', 'desc'));
}
But there’s a better way – to use
when():$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});
It may not feel shorter or more elegant, but the most powerful is passing of the parameters:
$query = User::query();
$query->when(request('role', false), function ($q, $role) {
return $q->where('role_id', $role);
});
$authors = $query->get();
10. BelongsTo Default Models
Let’s say you have Post belonging to Author and then Blade code:
{{ $post->author->name }}
But what if the author is deleted, or isn’t set for some reason? You will get an error, something like “property of non-object”.
Of course, you can prevent it like this:
{{ $post->author->name ?? '' }}
But you can do it on Eloquent relationship level:
public function author()
{
return $this->belongsTo('App\Author')->withDefault();
}
In this example, the
author() relation will return an empty App\Author model if no author is attached to the post.
Furthermore, we can assign default property values to that default model.
public function author()
{
return $this->belongsTo('App\Author')->withDefault([
'name' => 'Guest Author'
]);
}
11. Order by Mutator
Imagine you have this:
function getFullNameAttribute()
{
return $this->attributes['first_name'] . ' ' . $this->attributes['last_name'];
}
Now, you want to order by that
full_name? This won’t work:$clients = Client::orderBy('full_name')->get(); // doesn't work
The solution is quite simple. We need to order the results after we get them.
$clients = Client::get()->sortBy('full_name'); // works!
Notice that the function name is different – it’s not orderBy, it’s sortBy.
12. Default ordering in global scope
What if you want to have
User::all() always be ordered by name field? You can assign a global scope. Let’s go back to the boot() method, which we mentioned already above.protected static function boot()
{
parent::boot();
// Order by name ASC
static::addGlobalScope('order', function (Builder $builder) {
$builder->orderBy('name', 'asc');
});
}
Read more about Query Scopes here.
13. Raw query methods
Sometimes we need to add raw queries to our Eloquent statements. Luckily, there are functions for that.
// whereRaw
$orders = DB::table('orders')
->whereRaw('price > IF(state = "TX", ?, 100)', [200])
->get();
// havingRaw
Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();
// orderByRaw
User::where('created_at', '>', '2016-01-01')
->orderByRaw('(updated_at - created_at) desc')
->get();
14. Replicate: make a copy of a row
Short one. Without deep explanations, here’s the best way to make a copy of database entry:
$task = Tasks::find(1);
$newTask = $task->replicate();
$newTask->save();
15. Chunk() method for big tables
Not exactly Eloquent related, it’s more about Collection, but still powerful – to process bigger datasets, you can chunk them into pieces.
Instead of:
$users = User::all();
foreach ($users as $user) {
// ...
You can do:
User::chunk(100, function ($users) {
foreach ($users as $user) {
// ...
}
});
16. Create additional things when creating a model
We all know this Artisan command:
php artisan make:model Company
But did you know there are three useful flags to generate related files to the model?
php artisan make:model Company -mcr
- -m will create a migration file
- -c will create a controller
- -r will indicate that controller should be resourceful
17. Override updated_at when saving
Did you know that
->save() method can accept parameters? As a result, we can tell it to “ignore” updated_at default functionality to be filled with current timestamp. See this:$product = Product::find($id);
$product->updated_at = '2019-01-01 10:00:00';
$product->save(['timestamps' => false]);
Here we’re overriding default
updated_at with our pre-defined one.18. What is the result of an update()?
Have you ever wondered what this code actually returns?
$result = $products->whereNull('category_id')->update(['category_id' => 2]);
I mean, the update is performed in the database, but what would that
$result contain?
The answer is affected rows. So if you need to check how many rows were affected, you don’t need to call anything else –
update() method will return this number for you.19. Transform brackets into an Eloquent query
What if you have and-or mix in your SQL query, like this:
... WHERE (gender = 'Male' and age >= 18) or (gender = 'Female' and age >= 65)
How to translate it into Eloquent? This is the wrong way:
$q->where('gender', 'Male');
$q->orWhere('age', '>=', 18);
$q->where('gender', 'Female');
$q->orWhere('age', '>=', 65);
The order will be incorrect. The right way is a little more complicated, using closure functions as sub-queries:
$q->where(function ($query) {
$query->where('gender', 'Male')
->where('age', '>=', 18);
})->orWhere(function($query) {
$query->where('gender', 'Female')
->where('age', '>=', 65);
})
20. orWhere with multiple parameters
Finally, you can pass an array of parameters to
“Usual” way:
orWhere().“Usual” way:
$q->where('a', 1);
$q->orWhere('b', 2);
$q->orWhere('c', 3);
You can do it like this:
$q->where('a', 1);
$q->orWhere(['b' => 2, 'c' => 3]);
If you enjoyed these Eloquent tips, check out my online course Eloquent: Expert Level and learn about creating relationships, querying data effectively and exploring Eloquent features that you may not know about.
Subscribe to:
Posts (Atom)
-
https://www.nicesnippets.com/blog/laravel-9-comment-system-example-tutorial
-
✅ Step-by-Step: Install PostgreSQL via EDB Installer (No Brew) 🔗 1. Download the Installer Go to the official PostgreSQL download page:...
-
Laravel Queues allow you to delay a time-consuming task until a later time. By delaying the time-consuming task, you can improve the perfo...