Skąd wziąć id do drugiej tabeli?

0

Cześć, stawiam pierwsze kroki w Laravelu i aktualnie mam tabele A i B. W tabeli A występuje pole "id", które w drugiej tabeli ma być dokładnie takie samo i nosi nazwę "test_id". Teraz pytanie w jaki sposób można coś takiego zrobić ponieważ id w chwili tworzenia nie jest jeszcze znane przez autoinkrementację i nie wiadomo co wpisać do tabeli B. Kod mojej funkcji store controllera aktualnie wygląda następująco:

public function store(Request $request)
    {
        $post = new Posts;
        $post->title = 'test';
        $post->body = 'test2';
        $post->save();

        $test = new Tests;
        $test->competition_id->posts()->attach($test);
        $test->save();
}

Pytanie co tutaj zmienić, żeby to miało prawo poprawnie funkcjonować?

1

Po wykonaniu $post->save(); możesz odwołać się do $post->id.

0

Rzeczywiście, zadziałało. Dzięki!
A takie pytanie, czy powyższy kod można jakoś bardziej elegancko zapisać czy taka konwencja jest w porządku?

0

Ta obecna konwencja wygląda... źle ;-)
Pokaż kody Twoich modeli.

0

Posts.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Posts extends Model
{
    public function test()
    {
        return $this->belongsToOne(Tests::class);
    }
    protected $fillable = ['title', 'body'];
    protected $dates = ['created_at', 'updated_at'];
}

Tests.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tests extends Model
{
    public function posts()
    {
        return $this->belongsToOne(Posts::class);
    }
    protected $fillable = ['competition_id'];
    public $timestamps = false;

 }
}
0

Zdaje się, że to powinno wystarczyć:

$test->posts()->attach($post);
0
Patryk27 napisał(a):

Zdaje się, że to powinno wystarczyć:

$test->posts()->attach($post);

Chyba jednak nie, bo zwróciło "Call to undefined method App\Tests::belongsToOne()"

0

Racja :-)
Skąd masz belongsToOne()?

0

Zmieniłem na 'belongsTo', ale i tak jest: "Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsTo::attach()"

0

Musisz się zdecydować na rodzaj powiązania między tymi encjami - ma to być jeden-do-jednego, jeden-do-wielu czy wiele-do-wielu?

0
Patryk27 napisał(a):

Musisz się zdecydować na rodzaj powiązania między tymi encjami - ma to być jeden-do-jednego, jeden-do-wielu czy wiele-do-wielu?

jeden do jednego

0

W takim razie: https://laravel.com/docs/5.8/eloquent-relationships#one-to-one
A przypisywanie: $test->post_id = $post->id;.

1 użytkowników online, w tym zalogowanych: 0, gości: 1