---
name: "DBIx::Class::Helper::Schema::LintContents"
section: "3pm"
platform: "linux"
package: "libdbix-class-helpers-perl"
version: "2.037000-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/DBIx::Class::Helper::Schema::LintContents"
---

# DBIx::Class::Helper::Schema::LintContents(3pm)

suite of methods to find violated "constraints"

## NAME

DBIx::Class::Helper::Schema::LintContents - suite of methods to find violated "constraints"

## SYNOPSIS

```
 package MyApp::Schema;
 use parent 'DBIx::Class::Schema';
 __PACKAGE__->load_components('Helper::Schema::LintContents');
 1;
```

And later, somewhere else:

```
 say "Incorrectly Null Users:";
 for ($schema->null_check_source_auto('User')->all) {
    say '* ' . $_->id
 }
 say "Duplicate Users:";
 my $duplicates = $schema->dup_check_source_auto('User');
 for (keys %$duplicates) {
    say "Constraint: $_";
    for ($duplicates->{$_}->all) {
       say '* ' . $_->id
    }
 }
 say "Users with invalid FK's:";
 my $invalid_fks = $schema->fk_check_source_auto('User');
 for (keys %$invalid_fks) {
    say "Rel: $_";
    for ($invalid_fks->{$_}->all) {
       say '* ' . $_->id
    }
 }
```

## DESCRIPTION

Some people think that constraints make their databases slower.  As silly as that is, I have been in a similar situation!  I'm here to help you, dear developers!  Basically this is a suite of methods that allow you to find violated "constraints."  To be clear, the constraints I mean are the ones you tell DBIx::Class about, real constraints are fairly sure to be followed.

## METHODS

### fk\_check\_source

```
 my $busted = $schema->fk_check_source(
   'User',
   'Group',
   { group_id => 'id' },
 );
```

`"fk_check_source"` takes three arguments, the first is the **from** source moniker of a relationship.  The second is the **to** source or source moniker of a relationship. The final argument is a hash reference representing the columns of the relationship.  The return value is a resultset of the **from** source that do not have a corresponding **to** row.  To be clear, the example given above would return a resultset of `"User"` rows that have a `"group_id"` that points to a `"Group"` that does not exist.

### fk\_check\_source\_auto

```
 my $broken = $schema->fk_check_source_auto('User');
```

`"fk_check_source_auto"` takes a single argument: the source to check.  It will check all the foreign key (that is, `"belongs_to"`) relationships for missing... `"foreign"` rows.  The return value will be a hashref where the keys are the relationship name and the values are resultsets of the respective violated relationship.

### dup\_check\_source

```
 my $smashed = $schema->fk_check_source( 'Group', ['id'] );
```

`"dup_check_source"` takes two arguments, the first is the source moniker to be checked.  The second is an arrayref of columns that "should be" unique. The return value is a resultset of the source that duplicate the passed columns.  So with the example above the resultset would return all groups that are "duplicates" of other groups based on `"id"`.

### dup\_check\_source\_auto

```
 my $ruined = $schema->dup_check_source_auto('Group');
```

`"dup_check_source_auto"` takes a single argument, which is the name of the resultsource in which to check for duplicates.  It will return a hashref where they keys are the names of the unique constraints to be checked.  The values will be resultsets of the respective duplicate rows.

### null\_check\_source

```
 my $blarg = $schema->null_check_source('Group', ['id']);
```

`"null_check_source"` tales two arguments, the first is the name of the source to check.  The second is an arrayref of columns that should contain no nulls. The return value is simply a resultset of rows that contain nulls where they shouldn't be.

### null\_check\_source\_auto

```
 my $wrecked = $schema->null_check_source_auto('Group');
```

`"null_check_source_auto"` takes a single argument, which is the name of the resultsource in which to check for nulls.  The return value is simply a resultset of rows that contain nulls where they shouldn't be.  This method automatically uses the configured columns that have `"is_nullable"` set to false.

## AUTHOR

Arthur Axel "fREW" Schmidt \<frioux+cpan@gmail.com\>

## COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Arthur Axel "fREW" Schmidt.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
