Laravel firstOrСоздать поиск отношений - PullRequest
0 голосов
/ 30 мая 2018

Я хочу использовать firstOrCreate Функция Eloquent.Соответствующей частью моих Данных являются Спортсмены, принадлежащие к Нации и нации, в которых много спортсменов.(Отношение один ко многим)

class Athlete extends Model
{
  public $timestamps = false;
  protected $fillable = ['firstname', 'lastname', 'nation'];
.....
  public function nation()
  {
      return $this->belongsTo('App\Nation');
  }
}

и

class Nation extends Model
{
  public $timestamps = false;
...
  public function athletes()
  {
      return $this->hasMany('App\Athlete');
  }
}

Как я могу использовать firstOrCreate, если мне также нужно проверить нацию?

Ни то, ни другое

$ath = Athlete::firstOrCreate(['nation_id'=>$nation->id, 'lastname'=>$nn, 'sex'=>$sex, 'firstname'=>$vn] );

ни

$ath = Athlete::firstOrCreate(['nation'=>$nation, 'lastname'=>$nn, 'sex'=>$sex, 'firstname'=>$vn] );

работа.

Первый случай:

«Nation_id не имеет значения по умолчанию»

Второй случай:

Laravelпытается построить оператор WHERE с переданным объектом, который, очевидно, не работает.

Могу ли я использовать firstOrCreate здесь?

СПАСИБО.

Ответы [ 2 ]

0 голосов
/ 19 июня 2018

$fillable должен содержать имя столбца, а не имя отношения.Также отсутствует sex:

protected $fillable = ['firstname', 'lastname', 'sex', 'nation_id'];
0 голосов
/ 30 мая 2018

Сначала в защищенном поле $ fillable вы подчеркнули поле nation , относящееся к БД.В соответствии с этим я не понимаю поле nation_id во втором запросе попытки.

В декларации о связи, пожалуйста, подчеркните внешний ключ, чтобы разница между этими двумя полями (нация иnation_id) становится понятным.

Предполагая, что поле nation содержит отношение к записи Наций (соответствие по первичному уникальному идентификатору), вы можете сравнить предоставленные данные по этому идентификатору (длясравнение нации) и не во всех полях нации.

Тогда первый сообщенный вами случай, который я предположил, неверен

Первый случай: "Nation_id не имеет значения по умолчанию"

, потому что это означает, что вы вставляете спортсмена без указания идентификатора страны, и это означает, что этот идентификатор не проверяется в построителе запросов (возможно, потому что он равен нулю).Таким образом, вы не показываете сравнение с текущим атлетом и существующим атлетом БД, если нация равна нулю.

В общем, я предлагаю вам выполнить следующие шаги для выполнения вашей задачи:

  1. Проверьте правильность всех данных, передаваемых в построитель запросов
  2. . Напишите запрос следующим образом:

    $ath = Athlete::firstOrCreate(['field_that_contains_nation_id'=>$nation->id, 'other_athlete_fields' => $value, ...] );
    

    , затем выполните операцию для этой модели

    $ath->save();
    

    , еслиВы хотите знать, если запись создана, сделайте это:

    if($ath->wasRecentlyCreated){
        echo 'Created successfully';
    } else {
        echo 'Already exist';
    }
    

Если это уже не работает, пожалуйста, убедитесь, что отношения установлены правильно в таблицах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...