Access Active Record Relations and Logging

Hello,

I load data from my DB like this (using your example code):




$customers = Customer::find()

    ->with('orders')

    ->limit(100)

    ->all();



But how can I access a specific Order(using the ID) here?

When I make a new Query like this:




$order = Order::find()

    ->with(['id' => 1010])

    ->one();



It makes a new DB request.

But how can I get the Order with ID = 100?

Something like is not working:




$oder = customer->order[1010]



Or do I need to iterate the orders to get the Order I need?

And next:

I log all request to a log file. This works fine so far, but with one problem:

I get a lot of "System queries" logged like this:




SELECT

    d.nspname AS table_schema,

    c.relname AS table_name,

    a.attname AS column_name,

    t.typname AS data_type,

    a.attlen AS character_maximum_length,

    pg_catalog.col_description(c.oid, a.attnum) AS column_comment,

    a.atttypmod AS modifier,

    a.attnotnull = false AS is_nullable,

    CAST(pg_get_expr(ad.adbin, ad.adrelid) AS varchar) AS column_default,

    coalesce(pg_get_expr(ad.adbin, ad.adrelid) ~ 'nextval',false) AS is_autoinc,

    array_to_string((select array_agg(enumlabel) from pg_enum where enumtypid=a.atttypid)::varchar[],',') as enum_values,

    CASE atttypid

         WHEN 21 /*int2*/ THEN 16

         WHEN 23 /*int4*/ THEN 32

         WHEN 20 /*int8*/ THEN 64

         WHEN 1700 /*numeric*/ THEN

              CASE WHEN atttypmod = -1

               THEN null

               ELSE ((atttypmod - 4) >> 16) & 65535

               END

         WHEN 700 /*float4*/ THEN 24 /*FLT_MANT_DIG*/

         WHEN 701 /*float8*/ THEN 53 /*DBL_MANT_DIG*/

         ELSE null

      END   AS numeric_precision,

      CASE

        WHEN atttypid IN (21, 23, 20) THEN 0

        WHEN atttypid IN (1700) THEN

        CASE

            WHEN atttypmod = -1 THEN null

            ELSE (atttypmod - 4) & 65535

        END

           ELSE null

      END AS numeric_scale,

    CAST(

             information_schema._pg_char_max_length(information_schema._pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))

             AS numeric

    ) AS size,

    a.attnum = any (ct.conkey) as is_pkey

FROM

    pg_class c

    LEFT JOIN pg_attribute a ON a.attrelid = c.oid

    LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum

    LEFT JOIN pg_type t ON a.atttypid = t.oid

    LEFT JOIN pg_namespace d ON d.oid = c.relnamespace

    LEFT join pg_constraint ct on ct.conrelid=c.oid and ct.contype='p'

WHERE

    a.attnum > 0 and t.typname != ''

    and c.relname = 'seasons'

    and d.nspname = 'public'

ORDER BY

    a.attnum;



How can I disable logging this system queries?

Thanks,

Urkman

http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#findOne()-detail

That does not work for me…

Still sends a reuest to the DB…




$order=Order::find()->where(['id'=>100])->one();



To find out more about logging, you may go through the file @vendor\yiisoft\yii2\log\Logger.php

you can change your log settings in your configuration file




$config = [

    'components' => [

        'log' => [

            'traceLevel' => YII_DEBUG ? 3 : 0,

            'targets' => [

                [

                    'class' => 'yii\log\FileTarget',

                    'levels' => ['error', 'warning'],

                ],

            ],

        ],

    ],

];




if you do not want any logs, clear the level array, but read the Logger file before.

This sends request to the DB, but I don’t want this request as the data is already loaded by the first Query.

I just want an easy way to access the data loaded by the query.

This does not work, as all SQL Logs have Log Level "info"…

Is the logging happening in the same file name specified in mysqld log_bin?