logo
Ask your Symfony questions! Pay money and get answers fast! (more info)

Warning: Please do not give out any FTP or ssh credentials to anyone, unless you trust them completely. Giving out login details is dangerous.

If the asker does not get an answer then they have 10 days to request a refund.

$11
Outputting n:m relationship in dropdown list

I have symfony 1.3 and use doctrine.

I have a situation where I have vendors and locations. Locations can be shared between vendors.

Abbreviated schema:

Vendor:
columns:
id: { type: integer(4), primary: true, autoincrement: true }
name: { type: string(75), notnull:true }
relations:
Location: { refClass: VendorLocation, local: vendor_id, foreign: location_id }
VendorLocation:
options:
symfony:
form: false
filter: false
columns:
vendor_id: { type: integer(4), primary: true }
location_id: { type: integer(4), primary: true }
Location:
columns:
id: { type: integer(4), primary: true, autoincrement: true }
name: { type: string(100), notnull: true }
city: { type: string(50), notnull: true }
relations:
Vendor: { class: Vendor, refClass: AccountWarehouse, local: location_id, foreign: vendor_id }


I want to create a dropdown in a form (a form with shipping options) where a list of all shipping points is available. I want to have it list in the way: Vendor - LocationName (City). So, since it is many to many, it might look like:

VendorA - Location1 (MyCity)
VendorA- Location2 (NextCity)
VendorB - Location1 (MyCity)
VendorB - Location3 (MoreCity)
VendorC - Location4(AnotherCity)


In my location class i have (lib/model/doctrine/Location.class.php)

public function getVendorAndLocation()
{
return sprintf('%s - %s (%s, %s)', $this->getVendor()->getName, $this->getName(), $this->getCity(), $this->getZone());
}



lib/model/doctrine/LocationTable.class.php
 
public function listLocationsByVendorQuery()

{

$q = Doctrine_Query::create()

->select('l.name, l.city, l.city, l.id, v.id, v.name, vl.*')

->from('Location l')

->leftJoin('l.VendorLocation vl')

->leftJoin('l.Vendor v');

return $q;

}


In my form i have (lib/form/doctrine/ShipForm.class.php)

$this->widgetSchema['location_id'] = new sfWidgetFormDoctrineChoiceMany(array(
'model' => 'Location',
'query' => Doctrine::getTable('Location')->listLocationsByVendorQuery(),
'method' => 'getVendorAndLocation',
'multiple' => false
));




When I try it, I keep getting a doctrine collection instead of having it list as i want. SO, How can I make it output the n:m relationship like this?


VendorA - Location1 (MyCity)
VendorA- Location2 (NextCity)
VendorB - Location1 (MyCity)
VendorB - Location3 (MoreCity)
VendorC - Location4(AnotherCity)

webguy | 08/31/10 at 1:42pm Edit


(9) Responses

Note: webguy felt their question was unanswered, so we granted them a refund.

Note: webguy requested a refund. They offered no explanation.

If no one challenges a refund request, then they are automatically granted and proccessed after 48 hours. Admins of this site only review refund requests if someone challenges the request. If you are curious about how we handled previous refund requests, you may read over all refund requests and their challenges.

See a threaded view of answers?

Warning: Please do not give out any FTP or ssh credentials to anyone, unless you trust them completely. Giving out login details is dangerous.

  • avatar
    Last edited:
    08/31/10
    1:51pm
    Joshua Estes says:

    Can you post the code that corresponds with the function listLocationsByVendorQuery() in the LocationTable.class.php?

  • avatar
    Last edited:
    08/31/10
    2:05pm
    Pascal says:

    try that for the widget :



    $this->widgetSchema['location_id'] = new sfWidgetFormDoctrineChoice(array(
    'model' => 'Location',
    'table_method' => 'listLocationsByVendorQuery',
    'method' => 'getVendorAndLocation',
    ));


  • avatar
    Last edited:
    09/01/10
    7:57am
    Loban Rahman says:

    I feel that you are unnecessarily complicating matters by putting a widget for "location_id" in the ShipForm. What you want is a list of VendorLocation objects, so why not use a widget for that? Don't forget to declare a __toString() method in the VendorLocation model class with the output you want. If you like this idea, I can write up the code necessary for the widget.

  • avatar
    Last edited:
    08/31/10
    1:56pm
    webguy says:

    lib/model/doctrine/LocationTable.class.php

      public function listLocationsByVendorQuery()
    {
    $q = Doctrine_Query::create()
    ->select('w.name, w.city, z.code, w.postcode, w.contact, w.phone, w.id, a.id, a.name, aw.*')
    ->from('Warehouse w')
    ->leftJoin('w.AccountWarehouse aw')
    ->leftJoin('w.Zone z')
    ->leftJoin('w.Account a');
    return $q;
    }

  • avatar
    Last edited:
    08/31/10
    1:58pm
    webguy says:

    Please disregard that last post, look at body of question for accurate code

  • avatar
    Last edited:
    08/31/10
    2:06pm
    Joshua Estes says:

    public function getVendorAndLocation()
    {

    return sprintf('%s - %s (%s, %s)', $this->getVendor()->getName, $this->getName(), $this->getCity(), $this->getZone());

    }


    Noticed $this->getVendor()->getName doubt it's the issue, but shouldn't it be getName() instead of getName?

  • avatar
    Last edited:
    08/31/10
    2:12pm
    Joshua Estes says:

    Try removing the "query" option in the sfWidgetFormDoctrineChoice, that should work for you.

  • avatar
    Last edited:
    08/31/10
    2:28pm
    webguy says:

    the getName / getName() thing was a typo when I was writing up that response, so you're correct that's not the issue.

    Removing the "query" option is not a suitable solution, I rely on the method to narrow down choices (there is a softdelete and I wish to retain it for other reasons as well).

  • avatar
    Last edited:
    08/31/10
    2:29pm
    webguy says:

    Sorry, I checked but that results in the same issue.

This question has expired.





Current status of this question: Refunded



Warning: Please do not give out any FTP or ssh credentials to anyone, unless you trust them completely. Giving out login details is dangerous.

If the asker does not get an answer then they have 10 days to request a refund.