44
55use Exception ;
66use Illuminate \Database \Eloquent \Builder ;
7+ use Illuminate \Database \SQLiteConnection ;
78use Illuminate \Support \Arr ;
89use Illuminate \Support \Facades \DB ;
910use Illuminate \Support \Facades \Schema ;
@@ -46,25 +47,30 @@ public function __construct(array $builders = [])
4647 * Make new instance of UnionBuilder by the following models classes.
4748 *
4849 * @param array<class-string<\Illuminate\Database\Eloquent\Model>> $models
49- * @return UnionBuilder
50+ * @return \OpenSoutheners\LaravelEloquentUnionBuilder\ UnionBuilder
5051 */
5152 public static function from (array $ models )
5253 {
53- $ builders = [] ;
54+ $ unionBuilder = new static () ;
5455
55- foreach ($ models as $ model ) {
56- $ builders [$ model ] = $ model ::query ();
56+ foreach ($ models as $ model => $ columns ) {
57+ if (is_numeric ($ model )) {
58+ $ model = $ columns ;
59+ $ columns = null ;
60+ }
61+
62+ $ unionBuilder ->add ($ model ::query ());
5763 }
5864
59- return new static ( $ builders ) ;
65+ return $ unionBuilder ;
6066 }
6167
6268 /**
6369 * Search by text content on the following models using Laravel Scout.
6470 *
6571 * @param string $searchQuery
6672 * @param array<class-string<\Illuminate\Database\Eloquent\Model>>|array<class-string<\Illuminate\Database\Eloquent\Model>, array> $models
67- * @return UnionBuilder
73+ * @return \OpenSoutheners\LaravelEloquentUnionBuilder\ UnionBuilder
6874 */
6975 public static function search (string $ searchQuery , array $ models )
7076 {
@@ -76,7 +82,7 @@ public static function search(string $searchQuery, array $models)
7682 $ columns = null ;
7783 }
7884
79- if (! class_use ( $ model , Searchable::class)) {
85+ if (! in_array ( Searchable::class, class_uses ( $ model ) )) {
8086 throw new Exception ("Model ' $ {model}' does not use Laravel Scout. " );
8187 }
8288
@@ -88,7 +94,7 @@ public static function search(string $searchQuery, array $models)
8894
8995 $ unionBuilder ->add (
9096 $ model ::query ()->whereKey ($ modelSearchResultKeys ->toArray ()),
91- $ columns ?? Schema::getColumnListing ($ model:: getTableName ())
97+ $ columns ?? Schema::getColumnListing (( new $ model)-> getTable ())
9298 );
9399 }
94100
@@ -121,10 +127,15 @@ private function getUnionBuilder()
121127
122128 foreach ($ this ->builders as $ builder ) {
123129 $ model = get_class ($ builder ->getModel ());
124- $ modelSelectedColumns = $ this ->selectModelsColumns [$ model ];
130+ $ modelSelectedColumns = $ this ->selectModelsColumns [$ model ]
131+ ?? Schema::getColumnListing ($ builder ->getModel ()->getTable ());
132+
133+ if (! ($ builder ->getConnection () instanceof SQLiteConnection)) {
134+ $ model = str_replace ('\\' , '\\\\' , $ model );
135+ }
125136
126137 $ selectColumnsArr = [];
127- $ selectColumnsArr [] = DB ::raw ("' " .str_replace ( '\\' , '\\\\' , $ model) ."' as union_model_class " );
138+ $ selectColumnsArr [] = DB ::raw ("' " .$ model ."' as union_model_class " );
128139 $ selectColumnsArr = array_merge (
129140 $ selectColumnsArr ,
130141 array_map (function ($ item ) use ($ modelSelectedColumns ) {
@@ -157,9 +168,9 @@ public function getAllSelectedColumns()
157168 /**
158169 * Add Eloquent query builder to this union builder selecting the following columns.
159170 *
160- * @param Builder $builder
171+ * @param \Illuminate\Database\Eloquent\ Builder $builder
161172 * @param array $columns
162- * @return UnionBuilder
173+ * @return $this
163174 */
164175 public function add (Builder $ builder , array $ columns = [])
165176 {
0 commit comments