DBIx::Class::Helper::ResultSet::VirtualView - Clean up your SQL namespace (DEPRECATED)
Contents
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.
perl v5.40.0 2024-11-16 DBIx::Class::H...et::VirtualView(3pm)
Deprecated
This component has been suplanted by DBIx::Class::ResultSet::as_subselect_rs. In the next major version
(3) we will begin issuing a warning on it's use. In the major version after that (4) we will remove it
entirely.
Description
This component is will allow you to clean up your SQL namespace. See "NOTE" in
DBIx::Class::Helper::ResultSet for a nice way to apply it to your entire schema.
Methods
as_virtual_view
Act as a barrier to SQL symbols. The resultset provided will be made into a "virtual view" by including
it as a subquery within the from clause. From this point on, any joined tables are inaccessible to
->search on the resultset (as if it were simply where-filtered without joins). See "SYNOPSIS" for
example.
Name
DBIx::Class::Helper::ResultSet::VirtualView - Clean up your SQL namespace (DEPRECATED)
Note
You don't have to use this as a Component. If you prefer you can use it in the following manner:
# in code using ResultSet:
use DBIx::Class:Helper::VirtualView;
my $new_rs = DBIx::Class::Helper::VirtualView::as_virtual_view($rs);
Synopsis
# note that this is normally a component for a ResultSet
package MySchema::ResultSet::Bar;
use strict;
use warnings;
use parent 'DBIx::Class::ResultSet';
__PACKAGE__->load_components('Helper::ResultSet::VirtualView');
# and then in code that uses the ResultSet Join with relation x
my $rs = $schema->resultset('Bar')->search({'x.name' => 'abc'},{ join => 'x' });
# 'x' now pollutes the query namespace
# So the following works as expected
my $ok_rs = $rs->search({'x.other' => 1});
# But this doesn't: instead of finding a 'Bar' related to two x rows (abc and
# def) we look for one row with contradictory terms and join in another table
# (aliased 'x_2') which we never use
my $broken_rs = $rs->search({'x.name' => 'def'});
my $rs2 = $rs->as_virtual_view;
# doesn't work - 'x' is no longer accessible in $rs2, having been sealed away
my $not_joined_rs = $rs2->search({'x.other' => 1});
# works as expected: finds a 'table' row related to two x rows (abc and def)
my $correctly_joined_rs = $rs2->search({'x.name' => 'def'});
Thanks
Thanks to ijw from #dbix-class for the idea for this helper (originally called seal), most of the code,
and most of the documentation.
