[Laravel] Many-to-many relatie vanaf verkeerde kant pivotten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 12-09 13:07
Ik heb nu de volgende tabelstructuur:

customers
id_customername


suppliers
id_suppliername


customer_suppliers
id_supplierid_customernotes


Hierbij heb ik de bijbehorende models:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

class Supplier extends \Eloquent {
    public function customers() {
        return $this->belongsToMany('Customer', 'customer_suppliers', 'id_customer', 'id_supplier');
    }
}

class Customer extends \Eloquent {
    public function suppliers() {
        return $this->belongsToMany('Supplier', 'customer_suppliers', 'id_customer', 'id_supplier');
    }
}


In deze is mijn 'Customer' model ook gelijk de ingelogde user.
Het ophalen van een enkele 'Supplier' doe ik nu op de volgende manier:
PHP:
1
2
3
4
5
6
7
8
9
<?php

class SuppliersController extends \BaseController {
    public function show($id_supplier) {
        $supplier = Supplier::findOrFail($id_supplier);

        return View::make('supplier.show', compact('supplier'));
    }
}


Dit werkt, en ik krijg netjes het supplier object terug, Echter wil ik hier ook de inhoud van het 'notes' veld bij terugkrijgen, en dan specifiek de notities geplaatst door de ingelogde customer. Ik dacht dit te kunnen doen via de 'pivot' functionaliteit, echter krijg ik dan de aantekeningen van alle gerelateerde customers terug. Dit is niet de bedoeling. Is er een manier waarmee ik dit voor elkaar kan krijgen? (Bij voorkeur zonder zelf te gaan querien)

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 14:10
http://laravel.com/docs/4...working-with-pivot-tables
Je moet dus in je relatie withPivot('veld') gebruiken, en dan kan je op je relatie '->pivot->veld' doen.

PHP:
1
2
3
public function customers() {
        return $this->belongsToMany('Customer', 'customer_suppliers', 'id_customer', 'id_supplier')->withPivot('notes');
}


PHP:
1
2
3
4
$supplier = Supplier::findOrFail($id_supplier);
foreach($supplier->customers as $customer){
    echo $customer->name.': '.$customer->pivot->notes;
}


Werkt bij mij wel gewoon. (Overigens maak je het jezelf een stuk makkelijker als je aan Laravel conventies doet mbt tabellen, zoals gewoon 'id' gebruiken als primary key en 'customer_supplier' als pivot-tabel.)

[ Voor 10% gewijzigd door Barryvdh op 29-10-2014 20:29 ]


Acties:
  • 0 Henk 'm!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 12-09 13:07
Dit werkt inderdaad wel, echter heb ik dan nog steeds dat ik de notes van alle gebruikers terugkrijg, ik wil juist de notes van een enkele gebruiker terugzien (namelijk de gebruiker waarmee ik ingelogd ben)
(Overigens maak je het jezelf een stuk makkelijker als je aan Laravel conventies doet mbt tabellen, zoals gewoon 'id' gebruiken als primary key en 'customer_supplier' als pivot-tabel.)
Klopt inderdaad, echter moet de data die hieruit gegenereerd wordt ook weer in een ander systeem wat al draait. Dus kan ik hier helaas niet van afwijken.

offtopic:
Ik maak dankbaar gebruik van je ide-helper en debugbar!

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 14:10
naam schreef op woensdag 29 oktober 2014 @ 20:31:
Dit werkt inderdaad wel, echter heb ik dan nog steeds dat ik de notes van alle gebruikers terugkrijg, ik wil juist de notes van een enkele gebruiker terugzien (namelijk de gebruiker waarmee ik ingelogd ben)
En zoiets?
PHP:
1
$customer = $supplier->customers()->where('customers.id_customer', $currentUser)->first();

Kan je natuurlijk ook in je model zetten ofzo.
PHP:
1
2
3
4
public function currentCustomer() {
    return $this->customers()->where('customers.id_customer', Auth::user()->id)->first();
}
$customer = $supplier->currentCustomer();

Acties:
  • 0 Henk 'm!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 12-09 13:07
Ik heb een oplossing gevonden:

PHP:
1
2
3
4
5
6
7
public function customer($id_customer) {
    return $this
        ->belongsToMany('Customer', 'customer_supplier', 'id_customer', 'id_supplier')
        ->wherePivot('id_customer', Auth::user()->id)
        ->withPivot('notes')
        ->first();
}

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 14:10
Ja dat is hetzelfde als wat ik zei toch ;) (Behalve dat je nu nogmaals de BelongsToMany definieert ipv de bestaande customers() relatie gebruiken)

Acties:
  • 0 Henk 'm!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 12-09 13:07
Ja, inderdaad.. nu je het zegt :)
Pagina: 1