Почему Laravel ORM Eloquent не сохраняет правильные значения? - PullRequest
0 голосов
/ 24 сентября 2019

Я работаю в особых отношениях с laravel, где у меня есть статьи и совместимые статьи.Одна статья может иметь много совместимых статей, и в то же время совместимая статья имеет своего родителя как совместимого.

Статья A совместима с B, поэтому B совместима с A.

Для достижениядля этого я создал отношение «один ко многим», в котором у меня есть две таблицы:

статей и совместимых элементов

Столбцы articles:

$table->bigIncrements('id');
$table->string('code', 20)->unique();

Хотя compatiblesстолбцы таблицы:

$table->bigIncrements('id');
$table->unsignedBigInteger('primary_id');
$table->string('primary_code', 20);
$table->unsignedBigInteger('secondary_id');
$table->string('secondary_code', 20);

Чтобы создать статью, мне нужно сохранить данные два раза, правым и обратным образом, таким образом, при назначении статьи, совместимой, эта статья присваивается как совместимая с первойone:

$articulo = Articulo::findOrFail($request->get('id'));

foreach ($data['compatibles'] as $value) {

    $secundario = Article::select('id')->where('code',trim($value['compatible']))->first();

    $secondary_id = $secondary->id;
    $primary_id   = $article->id;

    $article->compatibles()->createMany([
            [
                'primary_id'       => $primary_id,
                'primary_code'     => trim($value['codigo']),
                'secondary_id'     => $secondary_id,
                'secondary_code'   => trim($value['compatible']),
            ],

            // inverse
            [
                'primary_id'       => $secondary_id, // secondary_id on primary_id place, but insert sentence doesn't respect this.
                'primary_code'     => trim($value['compatible']),
                'secondary_id'     => $primary_id, // primary_id at secondary_id place
                'secondary_code'   => trim($value['code']),
            ]
        ]
    );

}

Первый реестр отлично сохранен, но его обратный код повторяет primary_id вместо того, чтобы вместо этого сохранить virtual_id.

Если я выполняю print_r для отладки, массивыпоказывает правильно, но по некоторым причинам, которые я не могу понять, он не вставляет те же данные.

На всякий случай, я вставляю свои модели

class Compatible extends Model
{
    protected $connection = 'stock';
    protected $fillable = ['primary_id', 'primary_code', 'secondary_id', 'secondary_code'];

    public function article()
    {
        return $this->belongsTo('App\Article');
    }
}
class Article extends Model
{
    public function compatibles()
    {
        return $this->hasMany('App\Compatible', 'primary_id');
    }
}

У меня естьсказать, что весь этот процесс исключаетиспользуется в транзакции БД.Я относительно новичок в Laravel и не знаю, будет ли это мешать чему-либо.

...