1: <?php
2:
3: namespace Yajra\Datatables;
4:
5: use Illuminate\Database\Query\Builder as QueryBuilder;
6: use Illuminate\Support\Collection;
7: use Yajra\Datatables\Engines\CollectionEngine;
8: use Yajra\Datatables\Engines\EloquentEngine;
9: use Yajra\Datatables\Engines\QueryBuilderEngine;
10:
11: /**
12: * Class Datatables.
13: *
14: * @package Yajra\Datatables
15: * @method EloquentEngine eloquent($builder)
16: * @method CollectionEngine collection(Collection $builder)
17: * @method QueryBuilderEngine queryBuilder(QueryBuilder $builder)
18: * @author Arjay Angeles <aqangeles@gmail.com>
19: */
20: class Datatables
21: {
22: /**
23: * Datatables request object.
24: *
25: * @var \Yajra\Datatables\Request
26: */
27: public $request;
28:
29: /**
30: * Datatables builder.
31: *
32: * @var mixed
33: */
34: public $builder;
35:
36: /**
37: * Datatables constructor.
38: *
39: * @param \Yajra\Datatables\Request $request
40: */
41: public function __construct(Request $request)
42: {
43: $this->request = $request->request->count() ? $request : Request::capture();
44: }
45:
46: /**
47: * Gets query and returns instance of class.
48: *
49: * @param mixed $builder
50: * @return mixed
51: */
52: public static function of($builder)
53: {
54: $datatables = app(\Yajra\Datatables\Datatables::class);
55: $datatables->builder = $builder;
56:
57: if ($builder instanceof QueryBuilder) {
58: $ins = $datatables->usingQueryBuilder($builder);
59: } else {
60: $ins = $builder instanceof Collection ? $datatables->usingCollection($builder) : $datatables->usingEloquent($builder);
61: }
62:
63: return $ins;
64: }
65:
66: /**
67: * Datatables using Query Builder.
68: *
69: * @param \Illuminate\Database\Query\Builder $builder
70: * @return \Yajra\Datatables\Engines\QueryBuilderEngine
71: */
72: public function usingQueryBuilder(QueryBuilder $builder)
73: {
74: return new QueryBuilderEngine($builder, $this->request);
75: }
76:
77: /**
78: * Datatables using Collection.
79: *
80: * @param \Illuminate\Support\Collection $builder
81: * @return \Yajra\Datatables\Engines\CollectionEngine
82: */
83: public function usingCollection(Collection $builder)
84: {
85: return new CollectionEngine($builder, $this->request);
86: }
87:
88: /**
89: * Datatables using Eloquent.
90: *
91: * @param mixed $builder
92: * @return \Yajra\Datatables\Engines\EloquentEngine
93: */
94: public function usingEloquent($builder)
95: {
96: return new EloquentEngine($builder, $this->request);
97: }
98:
99: /**
100: * Allows api call without the "using" word.
101: *
102: * @param string $name
103: * @param mixed $arguments
104: * @return $this|mixed
105: */
106: public function __call($name, $arguments)
107: {
108: $name = 'using' . ucfirst($name);
109:
110: if (method_exists($this, $name)) {
111: return call_user_func_array([$this, $name], $arguments);
112: }
113:
114: return trigger_error('Call to undefined method ' . __CLASS__ . '::' . $name . '()', E_USER_ERROR);
115: }
116:
117: /**
118: * Get html builder class.
119: *
120: * @return \Yajra\Datatables\Html\Builder
121: */
122: public function getHtmlBuilder()
123: {
124: return app(\Yajra\Datatables\Html\Builder::class);
125: }
126:
127: /**
128: * Get request object.
129: *
130: * @return \Yajra\Datatables\Request|static
131: */
132: public function getRequest()
133: {
134: return $this->request;
135: }
136: }
137: