Problem with junction Table - relational access

Hi,

I need some help for my yii2 project.

I have two tables connected via a junction table:

[b][u]

Table 1: virtual_printers (id, name)[/u][/b]




    public function getVirtualPrinterMappings()

    {

        return $this->hasMany(VirtualPrinterMapping::className(), ['virtual_printer_id' => 'id']);

    }


    public function getPrinters()

    {

    	return $this->hasMany(Printers::className(), ['id' => 'printer_id'])

    			->via('virtualPrinterMappings');

    }

Table 2: printers (id, ip, name)


    public function getVirtualPrinterMappings()

    {

        return $this->hasMany(VirtualPrinterMapping::className(), ['printer_id' => 'id']);

    }


    public function getVirtualPrinters()

    {

    	return $this->hasMany(VirtualPrinters::className(), ['id' => 'virtual_printer_id'])

    			->via('virtualPrinterMappings');

    }

Junction table: virtual_printer_mappings (virtual_printer_id, printer_id, row)


    public function getPrinter()

    {

        return $this->hasOne(Printers::className(), ['id' => 'printer_id']);

    }


    public function getVirtualPrinter()

    {

        return $this->hasOne(VirtualPrinters::className(), ['id' => 'virtual_printer_id']);

    }

I now want to get the name of the real printer stored in the printers table with the ID of the virtual printer and the row.

I tried this:


$virtual_printer = VirtualPrinters::find()

		->with(['virtualPrinterMappings' => function ($query) use (&$row) {

			$query->select(['printer_id']);

			$query->andWhere(['row' => $row]);},])

		->where(["id" => $item->virtual_printer_id])

		->One();

I can see on the yii debugger that the sql seems good:


SELECT "printer_id" FROM "virtual_printer_mapping" WHERE ("row"='B') AND ("virtual_printer_id"=3)

Result should be ONE printer. Now I want to acess the data like this: $virtual_printer->printer->name; But it is not working.

I think there should be a smarter solution?

How exactly it’s not working?


<?xml version="1.0" encoding="UTF-8"?>

<response>

<name>Unknown Property</name>

<message>Getting unknown property: app\models\VirtualPrinters::printer</message>

<code>0</code>

<type>yii\base\UnknownPropertyException</type>

I played half of the night and I fixed it like this:

Adding to the model of virtualPrinters:


public function getPrinterByRow($row)

    {

    	return $this->hasMany(Printers::className(), ['id' => 'printer_id'])

    	->viaTable('virtual_printer_mapping', ['virtual_printer_id' => 'id'], function ($query) use (&$row) {

    		$query->andWhere(['row' => $row]);

    	});

    }

and call it like this: $item->virtualPrinter->getPrinterByRow($row)->one();