it-swarm.com.de

Laravel, sync () - Wie synchronisiere ich ein Array und übergebe zusätzliche Pivot-Felder?

Offizielle Laravel Dokumentation hat diese Funktion auf sync():

$user->roles()->sync( array( 1, 2, 3 ) );

Sie können den angegebenen IDs auch andere Pivot-Tabellenwerte zuordnen:

$user->roles()->sync( array( 1 => array( 'expires' => true ) ) );

Im letzteren Beispiel wird nur eine einzige Pivot-Reihe hinzugefügt. Was ich nicht verstehe, ist, wie ich andere Pivot-Tabellendatensätze zuordnen kann, wenn mehr als eine Zeile synchronisiert werden muss.

Danke im Voraus.

Um sync mehrere Modelle zusammen mit benutzerdefinierten Pivot-Daten zu erstellen, benötigen Sie Folgendes:

$user->roles()->sync( array( 
    1 => array( 'expires' => true ),
    2 => array( 'expires' => false ),
    ...
));

Dh.

sync( array( 
    related_id => array( 'pivot_field' => value ),
    ...
));

bearbeiten

Beantwortung des Kommentars:

$speakers  = (array) Input::get('speakers'); // related ids
$pivotData = array_fill(0, count($speakers), ['is_speaker' => true]);
$syncData  = array_combine($speakers, $pivotData);

$user->roles()->sync($syncData);
106
Jarek Tkaczyk

Das funktioniert bei mir

foreach ($photos_array as $photo) {

    //collect all inserted record IDs
    $photo_id_array[$photo->id] = ['type' => 'Offence'];  

}

//Insert into offence_photo table
$offence->photos()->sync($photo_id_array, false);//dont delete old entries = false
12
The Dude

Fügen Sie Ihrem Projekt das folgende Merkmal hinzu und fügen Sie es Ihrer Modellklasse als Merkmal hinzu. Dies ist hilfreich, da hierdurch Funktionen zur Verwendung mehrerer Pivots hinzugefügt werden. Wahrscheinlich kann jemand das ein wenig aufräumen und verbessern;)

namespace App\Traits;

trait AppTraits
{
    /**
     * Create pivot array from given values
     *
     * @param array $entities
     * @param array $pivots
     * @return array combined $pivots
     */
    public function combinePivot($entities, $pivots = [])
    {
        // Set array
        $pivotArray = [];
        // Loop through all pivot attributes
        foreach ($pivots as $pivot => $value) {
            // Combine them to pivot array
            $pivotArray += [$pivot => $value];
        }
        // Get the total of arrays we need to fill
        $total = count($entities);
        // Make filler array
        $filler = array_fill(0, $total, $pivotArray);
        // Combine and return filler pivot array with data
        return array_combine($entities, $filler);
    }
}

Modell:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Example extends Model
{
    use Traits\AppTraits;
    // ...
}

Verwendung:

// Get id's
$entities = [1, 2, 3];
// Create pivots
$pivots = [
    'price' => 634,
    'name'  => 'Example name',
];
// Combine the ids and pivots
$combination = $model->combinePivot($entities, $pivots);
// Sync the combination with the related model / pivot
$model->relation()->sync($combination);
1
Tom van Tilburg

Anbringen/Abnehmen

Eloquent bietet außerdem einige zusätzliche Hilfsmethoden, um das Arbeiten mit verwandten Modellen zu vereinfachen. Stellen wir uns zum Beispiel vor, ein Benutzer kann viele Rollen und eine Rolle kann viele Benutzer haben. Verwenden Sie die Methode attach, um einem Benutzer eine Rolle zuzuweisen, indem Sie einen Datensatz in die Zwischentabelle einfügen, die die Modelle verknüpft:

$user = App\User::find(1);

$user->roles()->attach($roleId);

Beim Anhängen einer Beziehung an ein Modell können Sie auch ein Array zusätzlicher Daten übergeben, die in die Zwischentabelle eingefügt werden sollen:

$user->roles()->attach($roleId, ['expires' => $expires]);

Sie können die Synchronisierung auch verwenden, wenn Sie alte Rollen entfernen und nur die neuen Rollen behalten möchten, die Sie gerade anhängen

$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires]);

Das Standardverhalten kann geändert werden, indem als zweites Argument 'false' übergeben wird. Dies fügt die Rollen mit den IDs 1,2,3 hinzu, ohne die vorhandenen Rollen zu beeinflussen.

In diesem Modus verhält sich die Synchronisierung ähnlich wie beim Anhängen.

$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires], false);

Referenz: https://laravel.com/docs/5.4/eloquent-relationships

1
Miguel Trevino

Einfach nur anhängen Ihre Felder und deren Werte an die Elemente:

$user->roles()->sync([
   1 => ['F1' => 'F1 Updated']
]);
0
X 47 48 - IR