Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
DBIx::Class::Helper::RUsertContributedxPerlss::Helper::ResultSet::SearchOr(3)

NAME
       DBIx::Class::Helper::ResultSet::SearchOr	- Combine ResultSet searches
       with OR's

SYNOPSIS
	package	MyApp::Schema::ResultSet::Tests;

	use parent 'DBIx::Class::ResultSet';

	__PACKAGE__->load_components(qw(Helper::ResultSet::IgnoreWantarray Helper::ResultSet::SearchOr));

	sub failed {
	  my $self = shift;

	  my $me = $self->current_source_alias;

	  $self->search({ "$me.passed" => '0' });
	}

	sub untested {
	  my $self = shift;

	  my $me = $self->current_source_alias;

	  $self->search({ "$me.passed" => undef	});
	}

	sub not_passed {
	  my $self = shift;

	  my $me = $self->current_source_alias;

	  $self->search_or([$self->failed, $self->untested]);
	}

	1;

DESCRIPTION
       I would argue that the most important feature of	DBIx::Class is the
       fact that you can "chain" ResultSet searches.  Unfortunately this can
       cause problems when you need to reuse multiple ResultSet	methods	as...
       well as or's.  In the past I got	around this by doing:

	$rs->foo->union([ $rs->bar]);

       While this works, it can	generate some hairy SQL	pretty fast.  This
       Helper is supposed to basically be a lightweight	union.	Note that it
       therefor	has a number of	"LIMITATIONS".	The thing that makes this
       module special is that the ResultSet that is doing the "search_or" ing
       still limits everything correctly.  To be clear,	the following only
       returns $user's friends that match either of the	following criteria:

	my $friend_rs =	$schema->resultset('Friend');
	my @internet_friends = $user->friends->search_or([
	  $friend_rs->on_facebook,
	  $friend_rs->on_twitter,
	])->all;

       With a union, you'd have	to implement it	like this:

	$user->friends->on_facebook->union([ $user->friends->on_twitter	]);

       The union will work, but	it will	generate more complex SQL that may
       have lower performance on your database.

       See "NOTE" in DBIx::Class::Helper::ResultSet for	a nice way to apply it
       to your entire schema.

METHODS
   search_or
	my $new_rs = $rs->search_or([ $rs->foo,	$rs->bar ]);

       "search_or" takes a single arrayref of ResultSets.  The ResultSets must
       point to	the same source	or you will get	an error message.
       Additionally, no	check is made to ensure	that more than one ResultSet
       is in the ArrayRef, but only passing one	ResultSet would	not make any
       sense.

LIMITATIONS
       Because this module us basically	an expression union and	not a true
       union, "JOIN"'s won't Just Work.	 If you	have a ResultSet method	that
       uses a "JOIN" and you want to "OR" it with another method, you'll need
       to do something like this:

	my @authors = $authors->search(undef, {	join =>	'books'	})->search_or([
	   $authors->wrote_good_books,
	   $authors->wrote_bestselling_books,
	])->all;

       Furthermore, if you want	to "OR"	two methods that "JOIN"	in the same
       relationship via	alternate paths	you must use union.

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

COPYRIGHT AND LICENSE
       This software is	copyright (c) 2017 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.24.1			  2DBIx::Class::Helper::ResultSet::SearchOr(3)

NAME | SYNOPSIS | DESCRIPTION | METHODS | LIMITATIONS | AUTHOR | COPYRIGHT AND LICENSE

Want to link to this manual page? Use this URL:
<https://www.freebsd.org/cgi/man.cgi?query=DBIx::Class::Helper::ResultSet::SearchOr&sektion=3&manpath=FreeBSD+12.1-RELEASE+and+Ports>

home | help