Laravel имеет много спасений - PullRequest
       10

Laravel имеет много спасений

0 голосов
/ 26 августа 2018

У меня есть две таблицы для сохранения данных.У одного из них есть внешний ключ, так что у меня отношения один ко многим.Однако я не понимаю, как сохранить данные в две таблицы одновременно.У меня есть один запрос, который содержит данные для одной таблицы и для другой, который должен быть присоединен к первой.

Это основная модель

class Site extends Model
{
    protected $fillable = ['path', 'site_link'];

    public $timestamps = false;

    public function features() {
        return $this->hasMany('App\SiteFeature');
    }
}

И это подмодель

class SiteFeature extends Model
{
    protected $fillable = ['feature', 'site_id'];

    public $timestamps = false;
}

Прямо сейчас мой контроллер выглядит следующим образом

class SiteController extends BaseController
{
    public function index()
    {
        return Site::all();
    }

    public function show(Site $id)
    {
        return $this->response->item($id, new SiteTransformer);
    }

    public function store(Request $request)
    {
        $site = Site::create($request->all());

        return response()->json($site, 201);
    }

Я знаю, что он сохранит его как один фрагмент данных.И я прошу вас помочь мне разбить данные на две таблицы.В документах я нашел способ хранения с отношением к существующей модели в БД, однако у меня нет этой модели на момент создания.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Решено таким образом

public function store(Request $request)
    {
        $site = Site::create([
            "path" => $request->path,
            "site_link" => $request->link,
        ]);

        foreach ($request->features as $feature) {
            $site->features()->save(new SiteFeature(["feature" => $feature]));
        }

        return response()->json($site, 201);
    }
0 голосов
/ 26 августа 2018

Есть определенные вещи, в которых вы должны убедиться.

Первое: в вашей SiteFeature -модели обратная связь с Site -моделями, кажется, отсутствует. Должна быть такая функция:

public function site() 
{
    return $this->belongsTo('App\Site');
}

См. Laravel 5.6 - Красноречивые отношения, один-ко-многим .

Если, однако, у вас есть отношения, в которых (n) сайты могут быть связаны с (n) SiteFeatures, ваши отношения и обратные отношения должны отличаться. (И там также должна быть сводная таблица, в которой вы можете хранить отношение n-to-n)

См. Laravel 5.6 - Красноречивые отношения, в этом случае многие-ко-многим .

Поскольку в вашем Вопросе не описывается, что получено с помощью $ request, вам следует учесть следующее:

  1. Подтвердите свои данные. Это гарантирует, что вы не сохраните мусор в своей базе данных
  2. Убедитесь, что у вас уже есть какая-то часть набора данных, которую вы хотите сохранить, затем сохраните в два этапа:

Первый шаг:

$site = Site::firstOrCreate(['path' => $request['input_name_for_path'],
                             'site_link' => $request['input_name_for_site_link'],
                           ]);

Это даст вам правильную Site -Модель, сохраненную в базе данных. (Обратите внимание, что это показывает, как вы вручную назначаете значения для полей, которые можно заполнить, определенных в модели, если у вас есть разные имена входных полей)

Теперь вы можете перейти на сохранение SiteFeature -Модели, подключенной к нему:

$feature = SiteFeature::firstOrCreate('feature' => $request['input_name_for_feature');
$site->features()->attach($feature->id);

Это должно сделать хитрость, сохраняя как новую (или старую) Site, так и связанную SiteFeature в вашей базе данных.

Если я неправильно понял вопрос, не стесняйтесь добавлять информацию, и я буду обновлять.

...