[Dbix-class] [PATCH] allow non-columns to be passed in joins using the from attribute

mike pulsation at gmail.com
Thu Sep 21 01:22:42 CEST 2006


On 9/20/06, mike <pulsation at gmail.com> wrote:
> i have no idea how backwards this is.  it took me over an hour just to
> track down where this was being generated.
>
> it allows you to pass a scalar ref as a condition to any custom JOINs
> using the from attribute.  i don't know if it affects anything else,
> but it makes my query (http://scsys.co.uk:8001/4102) work.

for those behind restrictive firewalls, the query desired is as follows:

SELECT
  `me`.`product_id`,
  `me`.`publisher_id`,
  `me`.`srds_classification_id`,
  `me`.`type`,
  `me`.`name`,
  `me`.`active`,
  `me`.`date_created`,
  `me`.`description`,
  `me`.`weight`,
  `me`.`universal`
FROM
  `products` `me`
  LEFT JOIN `authorizations` `authorizations` ON (
`authorizations`.`product_id` = `me`.`product_id` AND
`authorizations.active` = 1 )
WHERE
  (
      `me`.`active` = 1
    AND
      `me`.`publisher_id` = 2209
    AND
      `authorizations.authorization_id` IS NULL
  )
GROUP BY
  `me`.`product_id`

the affected part is the second condition for the JOIN.  without this
patch, the 1 is quoted as `1`, which is undesired.  with the patch,
passing the 1 as a scalar reference allows it to be passed unquoted.
the associated search construct is:

$rs->search
(
    {
        'me.publisher_id'                   => $publisher->id,
        'me.active'                         => 1,
        'authorizations.authorization_id'   => undef
    },
    {
        from        =>
        [
            { 'me', 'products' },
            [
                { 'authorizations', 'authorizations', -join_type => 'left' },
                {
                    'me.product_id'         => 'authorizations.product_id',
                    'authorizations.active' => \'1'
                }
            ]
        ],
        group_by    => [ 'me.product_id' ]
    }
);

i'm open to other suggestions; this is merely what i found to work for
me.  it merely retrieves the products that do *not* have any
associated authorizations with the active flag set to 1.

-mike



More information about the Dbix-class mailing list