Size: a a a

Laravel для начинающих

2020 September 25

MP

Maksim (Ellrion) Pla... in Laravel для начинающих
Andrey Helldar
И возникают вопросы:
1. Как несколько школ могут быть по одному адресу?
2. Почему если адрес совпадает, то должна создаваться новая запись школы с тем же адресом...

//если есть другие школы под тем же адресом, создаем новый

Получается, что его связь Address hasmany Schools превращается в hasOne, ведь он проверяет привязку школ к адресу...
он же объяснил. вот у тебя два (N) кружка в одном здании, один кружок переезжает и его редактируют
источник

AH

Andrey Helldar in Laravel для начинающих
Maksim (Ellrion) Platonov
он же объяснил. вот у тебя два (N) кружка в одном здании, один кружок переезжает и его редактируют
Смотри.
Вот у меня есть школа/кружок "Шитьё", который переезжает по адресу ул. Ленина, д.1.
Я ломлюсь в базу и смотрю есть ли другие школы/кружки по этому адресу. Вижу что есть и создаю новый.

В базе будут такие записи:
1 - ул. Ленина, д.1
2 - ул. Ленина, д.1

Ведь, адрес уже есть и код создаст новую запись.

И при обращении Address->schools вернётся массив всегда с одной записью, ведь при добавлении идёт проверка...
источник

YR

Yaroslav Rehulskyi in Laravel для начинающих
1. Это могут быть и жильцы, предоставляющие услуги на дому, и стоматология с частными докторами. Неважно.
2. В базе должен создаваться новый адрес, который и привяжет его к той же школе. Не превратится. Просто по тому адресу будет одна запись. Address->schools->first()
источник

MP

Maksim (Ellrion) Pla... in Laravel для начинающих
Andrey Helldar
Смотри.
Вот у меня есть школа/кружок "Шитьё", который переезжает по адресу ул. Ленина, д.1.
Я ломлюсь в базу и смотрю есть ли другие школы/кружки по этому адресу. Вижу что есть и создаю новый.

В базе будут такие записи:
1 - ул. Ленина, д.1
2 - ул. Ленина, д.1

Ведь, адрес уже есть и код создаст новую запись.

И при обращении Address->schools вернётся массив всегда с одной записью, ведь при добавлении идёт проверка...
нет не так, ты меняешь адрес школы, смотришь привязаны ли к этому адресу еще школы и что бы не менять адрес и им ты просто создаешь новый.
это так в его коде.
тут правда нет момента проверки что новые данные адресу уже не существует
источник

YR

Yaroslav Rehulskyi in Laravel для начинающих
да, нет проверки. Это я упустил. Тем более, куча проверок
источник

MP

Maksim (Ellrion) Pla... in Laravel для начинающих
Yaroslav Rehulskyi
да, нет проверки. Это я упустил. Тем более, куча проверок
как эквивалентность адреса у тебя проверяется? по полному соответсвию поля?

тогда я бы делал так
$newAdress = Address::firstOrCreate(...)
$schooll->address()->associate($account);
источник

AH

Andrey Helldar in Laravel для начинающих
Yaroslav Rehulskyi
Привет всем. У меня вопрос по оптимизации. Как можно сделать проще? Есть две модели. School belongsto Address. Address hasmany Schools. И я хочу изменить адрес школы, но таким образом, чтобы тот же адрес других школ оставался неизменным. Вот мой код:
$address = $school->address;

$hasAddressAnotherSchool = $address->schools()->where('id','<>',$school->id)->exists();

if ($hasAddressAnotherSchool) {
//если есть другие школы под тем же адресом, создаем новый
    DB::transaction(function () use ($request, $school, $address) {
       $address = $this->address->save($request);
       $school->update([
            'address_id' => $address['id']
       ]);
   });
}
else {
//иначе апдейтим старый
 $this->address->update($request, $school);
}
protected function hasAnotherSchool(School $school): bool
{
   return $school->addresses()
       ->where('id', '<>', $school->address_id)
       ->exists();
}

protected function update(Request $request, School $school)
{
   if ($this->hasAnotherSchool($school)) {
       $school->address()->save(
           new Address($request->validated())
       );
   } else {
       $school->address->update(
           $request->validated()
       );
   }
}
источник

AH

Andrey Helldar in Laravel для начинающих
Maksim (Ellrion) Platonov
нет не так, ты меняешь адрес школы, смотришь привязаны ли к этому адресу еще школы и что бы не менять адрес и им ты просто создаешь новый.
это так в его коде.
тут правда нет момента проверки что новые данные адресу уже не существует
Ой всё.
источник

AH

Andrey Helldar in Laravel для начинающих
Maksim (Ellrion) Platonov
как эквивалентность адреса у тебя проверяется? по полному соответсвию поля?

тогда я бы делал так
$newAdress = Address::firstOrCreate(...)
$schooll->address()->associate($account);
шуль) на дойч перешёл)))
источник

MP

Maksim (Ellrion) Pla... in Laravel для начинающих
сорян)
источник

AH

Andrey Helldar in Laravel для начинающих
Maksim (Ellrion) Platonov
как эквивалентность адреса у тебя проверяется? по полному соответсвию поля?

тогда я бы делал так
$newAdress = Address::firstOrCreate(...)
$schooll->address()->associate($account);
findOrCreate если найдёт адрес, то вернёт ему, а ему нужно создать если адрес найден...
источник

MP

Maksim (Ellrion) Pla... in Laravel для начинающих
он тут должен искаться именно по данным адреса
источник

AH

Andrey Helldar in Laravel для начинающих
источник

D

DK in Laravel для начинающих
источник

AP

Alexander Pavlenko 🌚... in Laravel для начинающих
🌚
источник

MP

Maksim (Ellrion) Pla... in Laravel для начинающих
Andrey Helldar
findOrCreate если найдёт адрес, то вернёт ему, а ему нужно создать если адрес найден...
смотри есть школы
1, школаA, 1
2, школаЫ, 1
3, школа123, 2

адреса
1, улПушкина
2, ХзГде

мы редактируем школу 2
вариант1 - меняем поле адреса на "ХзГде" тогда мы должны перепривязать эту школу к адресу 2
вариан2 - меняем поле адреса на "ГдеТоТам" тогда мы должны создать новую запись с адресом (такого у нас еще нет) и привязать школу к нему

в реале адрес определяется большим кол-вом полей конечно но суть так же
источник

AH

Andrey Helldar in Laravel для начинающих
Maksim (Ellrion) Platonov
смотри есть школы
1, школаA, 1
2, школаЫ, 1
3, школа123, 2

адреса
1, улПушкина
2, ХзГде

мы редактируем школу 2
вариант1 - меняем поле адреса на "ХзГде" тогда мы должны перепривязать эту школу к адресу 2
вариан2 - меняем поле адреса на "ГдеТоТам" тогда мы должны создать новую запись с адресом (такого у нас еще нет) и привязать школу к нему

в реале адрес определяется большим кол-вом полей конечно но суть так же
С логической точки зрения всё верно, но он, почему-то, создаёт новую запись в этом случае...
источник

AH

Andrey Helldar in Laravel для начинающих
В общем, на этом мои полномочия всё.
источник

MP

Maksim (Ellrion) Pla... in Laravel для начинающих
потому что он не учел https://t.me/laravel_web/329142
источник

MP

Maksim (Ellrion) Pla... in Laravel для начинающих
решение скорее всего простое https://t.me/laravel_web/329143
источник