Whenever you use Eloquent API Resources, you define the structure of the resulting JSON. So, you set the keys.
For what it's worth, returning this Customer::orderBy('name')->get() is a somewhat lazy approach; yes, it works, but your API will change whenever you modify the underlying table; almost (depending on what is hidden, or appended) every column in the table becomes a key/value pair in the response JSON. You lose control over the response.
The best practice for that it's to make resource for each model/controller?
And with this approach i can prepare my data to client side as i wish and not using hidden property or i should use it both resource & hidden together ?
No need for hidden properties on the model, your Resource will define the JSON representation of the Model so long as you return the Resource from the Controller.