|
15 | 15 | use Spatie\QueryBuilder\Filters\Filter as FilterInterface;
|
16 | 16 | use Spatie\QueryBuilder\Filters\FiltersExact;
|
17 | 17 | use Spatie\QueryBuilder\QueryBuilder;
|
| 18 | +use Spatie\QueryBuilder\Tests\TestClasses\Models\NestedRelatedModel; |
| 19 | +use Spatie\QueryBuilder\Tests\TestClasses\Models\RelatedModel; |
18 | 20 | use Spatie\QueryBuilder\Tests\TestClasses\Models\TestModel;
|
19 | 21 |
|
20 | 22 | beforeEach(function () {
|
|
283 | 285 | expect($modelsResult)->toHaveCount(0);
|
284 | 286 | });
|
285 | 287 |
|
| 288 | +it('can filter results by belongs to', function () { |
| 289 | + $relatedModel = RelatedModel::create(['name' => 'John Related Doe', 'test_model_id' => 0]); |
| 290 | + $nestedModel = NestedRelatedModel::create(['name' => 'John Nested Doe', 'related_model_id' => $relatedModel->id]); |
| 291 | + |
| 292 | + $modelsResult = createQueryFromFilterRequest(['relatedModel' => $relatedModel->id], NestedRelatedModel::class) |
| 293 | + ->allowedFilters(AllowedFilter::belongsTo('relatedModel')) |
| 294 | + ->get(); |
| 295 | + |
| 296 | + expect($modelsResult)->toHaveCount(1); |
| 297 | +}); |
| 298 | + |
| 299 | +it('can filter results by belongs to no match', function () { |
| 300 | + $relatedModel = RelatedModel::create(['name' => 'John Related Doe', 'test_model_id' => 0]); |
| 301 | + $nestedModel = NestedRelatedModel::create(['name' => 'John Nested Doe', 'related_model_id' => $relatedModel->id + 1]); |
| 302 | + |
| 303 | + $modelsResult = createQueryFromFilterRequest(['relatedModel' => $relatedModel->id], NestedRelatedModel::class) |
| 304 | + ->allowedFilters(AllowedFilter::belongsTo('relatedModel')) |
| 305 | + ->get(); |
| 306 | + |
| 307 | + expect($modelsResult)->toHaveCount(0); |
| 308 | +}); |
| 309 | + |
| 310 | +it('can filter results by belongs multiple', function () { |
| 311 | + $relatedModel1 = RelatedModel::create(['name' => 'John Related Doe 1', 'test_model_id' => 0]); |
| 312 | + $nestedModel1 = NestedRelatedModel::create(['name' => 'John Nested Doe 1', 'related_model_id' => $relatedModel1->id]); |
| 313 | + $relatedModel2 = RelatedModel::create(['name' => 'John Related Doe 2', 'test_model_id' => 0]); |
| 314 | + $nestedModel2 = NestedRelatedModel::create(['name' => 'John Nested Doe 2', 'related_model_id' => $relatedModel2->id]); |
| 315 | + |
| 316 | + $modelsResult = createQueryFromFilterRequest(['relatedModel' => $relatedModel1->id.','.$relatedModel2->id], NestedRelatedModel::class) |
| 317 | + ->allowedFilters(AllowedFilter::belongsTo('relatedModel')) |
| 318 | + ->get(); |
| 319 | + |
| 320 | + expect($modelsResult)->toHaveCount(2); |
| 321 | +}); |
| 322 | + |
| 323 | +it('can filter results by belongs multiple with different internal name', function () { |
| 324 | + $relatedModel1 = RelatedModel::create(['name' => 'John Related Doe 1', 'test_model_id' => 0]); |
| 325 | + $nestedModel1 = NestedRelatedModel::create(['name' => 'John Nested Doe 1', 'related_model_id' => $relatedModel1->id]); |
| 326 | + $relatedModel2 = RelatedModel::create(['name' => 'John Related Doe 2', 'test_model_id' => 0]); |
| 327 | + $nestedModel2 = NestedRelatedModel::create(['name' => 'John Nested Doe 2', 'related_model_id' => $relatedModel2->id]); |
| 328 | + |
| 329 | + $modelsResult = createQueryFromFilterRequest(['testFilter' => $relatedModel1->id.','.$relatedModel2->id], NestedRelatedModel::class) |
| 330 | + ->allowedFilters(AllowedFilter::belongsTo('testFilter', 'relatedModel')) |
| 331 | + ->get(); |
| 332 | + |
| 333 | + expect($modelsResult)->toHaveCount(2); |
| 334 | +}); |
| 335 | + |
| 336 | +it('can filter results by belongs multiple with different internal name and nested model', function () { |
| 337 | + $testModel1 = TestModel::create(['name' => 'John Test Doe 1']); |
| 338 | + $relatedModel1 = RelatedModel::create(['name' => 'John Related Doe 1', 'test_model_id' => $testModel1->id]); |
| 339 | + $nestedModel1 = NestedRelatedModel::create(['name' => 'John Nested Doe 1', 'related_model_id' => $relatedModel1->id]); |
| 340 | + $testModel2 = TestModel::create(['name' => 'John Test Doe 2']); |
| 341 | + $relatedModel2 = RelatedModel::create(['name' => 'John Related Doe 2', 'test_model_id' => $testModel2->id]); |
| 342 | + $nestedModel2 = NestedRelatedModel::create(['name' => 'John Nested Doe 2', 'related_model_id' => $relatedModel2->id]); |
| 343 | + |
| 344 | + $modelsResult = createQueryFromFilterRequest(['test_filter' => $testModel1->id.','.$testModel2->id], NestedRelatedModel::class) |
| 345 | + ->allowedFilters(AllowedFilter::belongsTo('test_filter', 'relatedModel.testModel')) |
| 346 | + ->get(); |
| 347 | + |
| 348 | + expect($modelsResult)->toHaveCount(2); |
| 349 | +}); |
| 350 | + |
| 351 | +it('throws an exception when trying to filter by belongs to with an inexistent relation', function ($relationName, $exceptionClass) { |
| 352 | + $this->expectException($exceptionClass); |
| 353 | + |
| 354 | + $modelsResult = createQueryFromFilterRequest(['test_filter' => 1], RelatedModel::class) |
| 355 | + ->allowedFilters(AllowedFilter::belongsTo('test_filter', $relationName)) |
| 356 | + ->get(); |
| 357 | + |
| 358 | +})->with([ |
| 359 | + ['inexistentRelation', \BadMethodCallException::class], |
| 360 | + ['testModel.inexistentRelation', \BadMethodCallException::class], // existing 'testModel' belongsTo relation |
| 361 | + ['inexistentRelation.inexistentRelation', \BadMethodCallException::class], |
| 362 | + ['getTable', \Illuminate\Database\Eloquent\RelationNotFoundException::class], |
| 363 | + ['testModel.getTable', \Illuminate\Database\Eloquent\RelationNotFoundException::class], // existing 'testModel' belongsTo relation |
| 364 | + ['getTable.getTable', \Illuminate\Database\Eloquent\RelationNotFoundException::class], |
| 365 | + ['nestedRelatedModels', \Illuminate\Database\Eloquent\RelationNotFoundException::class], // existing 'nestedRelatedModels' relation but not a belongsTo relation |
| 366 | + ['testModel.relatedModels', \Illuminate\Database\Eloquent\RelationNotFoundException::class], // existing 'testModel' belongsTo relation and existing 'relatedModels' relation but not a belongsTo relation |
| 367 | +]); |
| 368 | + |
286 | 369 | it('can filter results by scope', function () {
|
287 | 370 | $testModel = TestModel::create(['name' => 'John Testing Doe']);
|
288 | 371 |
|
|
0 commit comments