- https://speakerdeck.com/willroth/50-laravel-tricks-in-50-minutes
- https://www.reddit.com/r/laravel/comments/3to60i/50_laravel_tricks/
- 1. Automatic Model Validation
- 2. Prevent Uploading
- 3. Conditional Relationships
- 4. Expressive "where" syntax
- 5. Query Builder: having raw
- 6. Simple Date filtering
- 7. Save options
- 8. Multilanguage Support *
- 9. Retreive random rows
- 10. UUID Model Primary Keys
- 11. Ordered relationships
- 12. Simple incrementing and Decrementing
- 13. Lists with Mutations
- 14. Appending mutated properties
- 15. Filter only rows with Child rows
- 16. Return relations on model save
- 17. Dynamic With
- 18. First/Last Array Element
- 19. Arrays as Collections
- 20. Collection Filters
- 21. find()
- 22. where()
- 23. implode()
- 24. where() & list()
- 25. Order belongsToMany by pivot table value
- 26. Sorting with closures
- 27. Keying arrays
- 28. Grouped Collections
- 29. Collection Unions
- 30. Collection Look-aheads
- 31. Nested Route groups
- 32. Catch-all view route
- 33. Internal dispatch
- 34. Environment Variables
- 35. Run tests automatically
- 36. Share cookies between domains
- 37. Easy model and migration stubs
- 38. Add Spark to an existing project
- 39. Customize the default error page
- 40. Conditional service providers
- 41. Change a column name in a migration
- 42. Checking if a view exists
- 43. Extending the Application
- 44. Simple cache microservice
- 45. Using the bleeding-edge version of Laravel
- 46. Capture queries
- 47. Authorization without models
- 48. Efficient file transfers with Streams
- 49. Avoiding overflowing log files
- 50. Pipelines
class Post extends Eloquent
{
public staic $autoValidates = true;
protected static $rules = [];
protected static function boot()
{
parent::boot();
// or static::creating, or static::updating
static::saving(function($model)
{
if ($model::$autoValidates) {
return $model->validate();
}
});
}
public function validate()
{
}
}
class Post extends Eloquent
{
protected static function boot()
{
parent::boot();
static::updating(function($model)
{
return false;
});
}
}
class myModel extends Model
{
public function category()
{
return $this->belongsTo('myCategoryModel', 'categories_id')
->where('users_id', Auth::user()->id);
}
}
$products = Product::where('category', '=', 3)->get();
$products = Product::where('category', 3)->get();
$products = Product::whereCategory(3)->get();
SELECT *, COUNT(*) FROM products GROUP BY category_id HAVING count(*) > 1;
DB::table('products')
->select('*', DB::raw('COUNT(*) as products_count'))
->groupBy('category_id')
->having('products_count', '>', 1)
->get();
$q->whereDate('created_at', date('Y-m-d'));
$q->whereDay('created_at', date('d'));
$q->whereMonth('created_at', date('m'));
$q->whereYear('created_at', date('Y'));
// src/Illuminate/Database/Eloquent/Model.php
public function save(array $options = [])
// src/Illuminate/Database/Eloquent/Model.php
protected function performUpdate(Builder $query, array $options=[])
{
if ($this->timestamps && array_get($options, 'timestamps', true))
{
$this->updateTimestamps();
}
}
$product = Product::find($id);
$product->updated_at = '2015-01-01 00:00:00';
$product->save(['timestamps'=>false]);
// TODO
$questions = Question::orderByRaw('RAND()')->take(10)->get();
use Ramsey\Uuid\Uuid;
trait UUIDModel
{
public $incrementing = false;
protected static function boot()
{
parent::boot();
static::creating(function ($model)
{
$key = $model->getKeyName();
if (empty($model->{$key})) {
$model->{$key} = (string) $model->generateNewUuid();
}
});
}
public function generateNewUuid()
{
return Uuid::uuid4();
}
}
class Category extends Model
{
public function products()
{
return $this->hasMany('App\Product')->orderBy('name');
}
}
$customer = Customer::find($customer_id);
$loyalty_points = $customer->loyalty_points + 50;
$customer->update(['loyalty_points' => $loyalty_points]);
// adds one loyalty point
Customer::find($customer_id)->increment('loyalty_points', 50);
// subtracts one loyalty point
Customer::find($customer_id)->decrement('loyalty_points', 50);
$employees = Employee::where('branch_id', 9)->lists('name', 'id');
return view('customers.create', compact('employees'));
{!! Form::select('employee_id', $employees, '') !!}
public function getFullNameAttribute()
{
return $this->name . ' ' . $this->surname;
}
[2015-07-19 21:47:19] local.ERROR: exception 'PDOException'...Column not found:...'full_name'
$employees = Employee::where('branch_id', 9)->get()->lists('full_name', 'id');
function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
class User extends Model
{
protected $appends = ['full_name'];
}
class Category extends Model
{
public function products()
{
return $this->hasMany('App\Product');
}
}
public function getIndex()
{
$categories = Category::with('products')->has('products')->get();
return view('categories.index', compact('categories'));
}
public function store()
{
$post = new Post;
$post->fill(Input::all());
$post->user_id = Auth::user()->user_id;
$post->user;
return $post->save();
}
// eloquent
Post::whereSlug('slug')->get();
// instead of
View::make('posts.index')->with('posts', $posts);
// do this
View::make('posts.index')->withPosts($posts);
// hide all but the first item
@foreach ($menu as $item)
<div @if ($item != reset($menu)) class="hidden" @endif>
<h2>{{ $item->title }}</h2>
</div>
@endforeach
// apply CSS to last item only
@foreach ($menu as $item)
<div @if ($item == end($menu)) class="no_margin" @endif>
<h2>{{ $item->title }}</h2>
</div>
@endforeach
$devs = [
['name' => 'Anouar Abdessalam', 'email' => 'dtekind@gmail.com'],
['name' => 'Bilal Ararou', 'email' => 'have@noIdea.com'],
];
$devs = new \Illuminate\Support\Collection($devs);
Keeps the item only if the closure returns true
$customers = Customer::all();
$us_customers = $customers->filter(function($customer)
{
return $customer->country == 'United States';
});
// returns a single row as a collection
$collection = Person::find([1]);
// returns multiple rows as a collection
$collection = Person::find([1, 2, 3]);
$collection = Person::all();
$programmers = $collection->where('type', 'programmer');
$collection = Person::all();
$names = $collection->implode('first_name', ',');
// returns a collection of first names
$collection = Person::all()->where('type', 'engineer')->lists('first_name');
// returns all meta records for user 1
$collection = WP_Meta::whereUserId(1)->get();
// returns first name meta values
$first_name = $collection->where('meta_key', 'first_name')->lists('value')[0];
class Link extends Model
{
public function users()
{
return $this->belongsToMany('Phpleaks\User')->withTimestamps();
}
}
@if ($link->users->count() > 0)
<strong>Recently Favorited By</strong>
@foreach ($link->users()->orderBy('link_user.created_at', 'desc')->take(15)->get() as $user)
...
@endforeach
@endif
$sorted = $collection->sortBy(function($product, $key)
{
return array_search($product['name'], [1=>'Bookcase', 2=>'Desk', 3=>'Chair']);
});
Defines the 'key' for an array-as-collection (for use with e.g. ->contains
)
$library = $books->keyBy('title');
$collection = Person::all();
$grouped = $collection->groupBy('type');
// the point is to actually combine results from different models
$collection = new Collection;
$all = $collection->merge($programmers)->merge($critics)->merge($engineers);
$collection = collect([1=>11, 5=>13, 12=>14, 21=>15])->getCachingIterator();
foreach ($collection as $key=>$value)
{
dump ($collection->current() . ':' . $collection->getInnerIterator()->current());
}
Route::group(['prefix'=> => 'account', 'as' => 'account.'], function()
{
Route::get('login', ['as' => 'login', 'uses' => AccountController::Class.'@getLogin']);
});
<a href="{{ route('account.login') }}">Login</a>
// app/Http/routes.php
Route::group(['middleware' => 'auth'], function()
{
Route::get('{view}', function($view)
{
try {
return view($view);
} catch (\Exception $e) {
abort(404);
}
})->where('view', '.*');
});
// api controller
public funciton show(Car $car)
{
if (Input::has('fields')) {
// do something
}
}
// internal request to api - fields are lost
$request = Request::create('/api/cars/' . $id . '?fields=id,color', 'GET');
$response = json_decode(Route::dispatch($request)->getContent());
// internal request to api - with fields
$originalInput = Request::input();
$request = Request::create('/api/cars' . $id . '?fields=id,color', 'GET');
Request::replace($request->input());
$response = json_decode(Route::dispatch($request)->getContent());
Request::replace($originalInput);
// phpunit.xml
<php
<env name="APP_ENV" value="testing" />
</php>
// .env.test - add to .gitignore
TWILIO_ACCOUNT_SID=blank
// within createApplication() method of TestCase.php
if (file_exists(dirname(__DIR__) . '/.env.test')) {
Dotenv::load(dirname(__DIR__), '.env.test');
}
// gulpfile.js
var elixir = require('laravel-elixir');
mix.phpUnit();
$ gulp tdd
// app/Http/Middleware/EncryptCookies.php
protected $except = [
'shared_cookie',
];
Cookie::queue('shared_cookie', 'my_shared_value', 10080, null, '.example.com');
$ artisan make:model Books -m
Notes: Do not run spark:install
, backup /resources/views/home.blade.php
before running
$ composer require genealabs/laravel-sparkinstaller --dev
$ php artisan spark:upgrade
$ php artisan vendor:publish --tag=spark-full
// config/app.php
Laravel\Spark\Providers\SparkServiceProvider::class,
GeneaLabs\LaravelSparkInstaller\Providers\LaravelSparkInstallerServiceProvider::class,
<?php namespace App\Exceptions;
use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\Debug\ExceptionHandler as SymfonyDisplayer;
class Handler extends ExceptionHandler
{
protected function convertExceptionToResponse(Exception $e)
{
$debug = config('app.debug', false);
return $debug
? (new SymfonyDisplayer($debug))->createResponse($e)
: response()->view('errors.default', ['exception' => $e], 500);
}
}
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->bind(
\Illuminate\Contracts\Auth\Registrar::class,
\App\Services\Registrar::class
);
if ($this->app->environment('production')) {
$this->app->register(\App\Providers\ProductionErrorHandlerServiceProvider::class);
}
else {
$this->app->register(\App\Providers\VerboseErrorHandlerServiceProvider::class);
}
}
$ composer require doctrine/dbal
public function up()
{
Schema::table('users', function ($table)
{
$table->string('name', 50)->change();
});
}
if (view()->exists("emails.{$template}")) {
// ...sending an email to the customer
}
// bootstrap/app.php
// replace this:
$app = new \Illuminate\Foundation\Application( realpath(__DIR__.'/../'));
// with this:
$app = new \Fantabulous\Application( realpath(__DIR__.'/../'));
// and add
<?php namespace Fantabulous;
class Application extends \Illuminate\Foundation\Application
{
public function storagePath()
{
return $this->basePath.'/FantabulousStorage';
}
}
class fakeApiCaller
{
public function getResultsForPath($path)
{
return [
'status' => 200,
'body' => json_encode([
'title' => "Results for path [$path]"
]),
'headers' => [
"Content-Type" => "application/json",
]
];
}
}
$app->get('{path?}', function($path)
{
$result = Cache::remember($path, 60, function() use ($path)
{
return (new fakeApiCaller)->getResultsForPath($path);
});
return response($result['body'], $result['status'], array_only(
$result['headers'], ['Content-Type', 'X-Pagination']
));
})->where('path', '.*');
$ composer create-project laravel/laravel your-project-name dev-develop
// composer.json
{
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.2.*"
},
"minimum-stability": "dev"
}
Event::listen('illuminate.query', function($query)
{
var_dump($query);
});
\DB::listen(function($query, $bindings, $time)
{
var_dump( $query, $bindings, $time);
});
// app/Policies/AdminPolicy.php
class AdminPolicy
{
public function managePages($user)
{
return $user->hasRole(['Administrator', 'Content Editor']);
}
}
// app/Providers/AuthServiceProvider.php
public function boot( \Illuminate\Contracts\Auth\Access\GateContract $gate)
{
foreach (get_class_methods(new \App\Policies\AdminPolicy) as $method) {
$gate->define($method, \App\Policies\AdminPolicy::class . "@{$method}");
}
$this->registerPolicies($gate);
}
$this->authorize('managePages'); // in Controllers
@can('managePages') // in Blade
$user->can('managePages'); // via Eloquent
$disk = Storage::disk('s3');
$disk->put($targetFile, file_get_contents($sourceFile));
$disk = Storage::disk('s3');
$disk->put($targetFile, fopen($sourceFile, 'r+'));
$disk = Storage::disk('s3');
$stream = $disk->getDriver()->readStream($sourceFileOnS3);
file_put_contents($targetFile, stream_get_contents($stream), FILE_APPEND);
$stream = Storage::disk('s3')->getDriver()->readStream($sourceFile);
Storage::disk('sftp')->put($targetFile, $stream);
$schedule->call(function()
{
Storage::delete($logfile);
})->weekly();
$result = (new \Illuminate\Pipeline\Pipeline($container))
->send($something)
->through('ClassOne', 'ClassTwo', 'ClassThree')
->then(function ($something)
{
return 'foo';
});
25. Order belongsToMany by Pivot Table value
Using take(15) increases your chances of getting error. limit(15) is safer than take(15). If collection doesn't have 15 value, the error occurs.
People may think your usage was wrong, but the problem may be in the take() function.