Как стать автором
Обновить
0
0
Jenly @Jenly

Пользователь

Отправить сообщение
<li v-for="(book, index) in this.$store.state.books.list" :key=«index»>{{book.title}}


Пожалуйста, нет, не надо так
В 2018 мигрировать на yii2 для сколько-нибудь серьезного приложения странно, минимум на yii3.
А так выглядит, что люди, которые умеют пользоваться только молотком, на все смотрят как на гвозди.
Если проекты на yii, продолжают развиваться, то каждому разработчику рано или поздно приходит мысль: «как было бы хорошо, если бы это было не Yii»
Человечество не придумало примера для Open-closed Principle без использования геометрических фигур.
Господи, за что я заслужил такой хабр.
Спасибо за собеседование, мы вам позвоним
Писать на native PHP в 2017 году далеко не лучший вариант

Работая над проектом мы получили опыт, который сложно описать в рамках одного поста.


Сказали люди и поставили Битрикс
Вы не можете участвовать в АДМ-2017.

Спасибо!
Как по мне, SQL vs ORM некорректное сравнение у своего основания.

sql — это язык, ORM — это оверхэд над sql, как большинство языков это оверхэд над процессором.

Задача ORM — абстрагироваться от базы данных. Каждый объект ОRM служит определенной цели в бизнес-логике. Мы перестаем думать о базе данных в принципе, а начинаем мыслить объектом и целью для которой он создан.

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

Так что бы получить всех пользователей которые привязаны к одному банку мы сделаем, что-то вроде: $banks = $user->getBanks()->getUsers();

Получить адреса банка пользователя: $banksAddr = $user->getBanks()->getAddrs();

Теперь мы хотим, чтобы пользователь мог, что-то заказать с сайта, если у него указан хотя бы один банк:
if($user->hasBanks()){}


Так же, в каждый момент времени мы должны быть уверены, что кто-то не допишет sql, который уберет нам половину данных или наоборот запишет в базу потеряв в половину.
Или кто-то добавил обязательное поле в таблицу, чтобы все запросы работали корректно, нам нужно поправить 1 entity class и все запросы продолжат работать.

Всю ответственность за целостность данных берет на себя берет ORM.

Так в пример с книгами это было бы

class Book
{

  /**
     * @ORM\ManyToMany(targetEntity="Author", inversedBy="books", fetch="EXTRA_LAZY")
     * @ORM\JoinTable(name="books_author")
     */
    private $authors;
}

class Author
{
 /**
     * @ORM\ManyToMany(targetEntity="Book", mappedBy="authors")
     */
    private $books;
}


Теперь мы можем получить для книги всех ее авторов, а для автора — книги

$idBook = 10;
$authors = $em->getRepository('Books::class')->find($idBook)->getAuthors();


А чтобы сохранить книгу мы должны обязательно иметь связь хотя бы с одним автором.

class createBook
{
function createAction(){
  $idAuthor = 10;
  $author = $em->getRepository('Books::Author')->find($idAuthor);
  $book = new Book();
  $book->setAuthor($author);
  $em->persist($book);
  $em->flush($book);

}
}

Допустим, стоит задача обновить двум последним авторам имя на «Жорж».

Сразу скажу, что выразить через DQL мне этот запрос вообще не удалось, с вложенными подзапросами там всё плохо.


Вот так, например

public function get2LastAuthors ()
    {
    	 $result = $this->createQueryBuilder('u')
            ->select('a')
            ->addOrderBy('a.id', 'DESC')
            ->setMaxResults( 2 );
            ->getQuery()
            ->getResult();
            return $result;
            
	}



class AuthorsController
{
	$doctrine = $this->getDoctrine();
	$em = $this->getDoctrine()->getManager();
	//используем QueryBuilder
	$authors = $em->getRepository(Books::class)->get2LastAuthors();
	//или так
	$authors = $em->getRepository('Books::class')->findBy([], ['id' => 'ASC'], 2);

	$name = "Жорж";
	foreach($authors as $val){
            $val->setName($name);
	}
	$em->flush();
}


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


Результат findAll — не отдаст вам автором и собственно не должен, вы же книги хотите получить. Но при этом доктрина в любой момент времени знает, где этих авторов взять, если спросить у нее.

Если нужно получить получить информацию одним запросом, то используем EntityRepository.

class BooksRepository extends EntityRepository
{

    public function getBooksWithAuthors ()
    {
    	 $result = $this->createQueryBuilder('u')
            ->select('u, a')
            ->leftJoin('u.authors', 'a')
            ->getQuery()
            ->getResult();

            return $result;
            
	}
}


Уточню, что authors — ManyToMany связь для Books и entity класс для книг создан правильно, а не так как в примере.

class BooksController
{
	$doctrine = $this->getDoctrine();
	$books = $doctrine->getRepository(Books::class)->getBooksWithAuthors();
}


И получаем все в одном запросе. Книги с их авторами.

dump($books)
Это так выглядит зависть?!
Я бы посмотрел.
Есть РЖД в портфеле?
Я очень люблю ваши статьи и доклады. Спасибо!
Вы вообще осознаете, что перевели статью 4 летней давности?
Есть еще 2 крутых книжки Хокинга, по его же словам в книгах только 1 формула на всю книгу.
Вселенная Стивена Хокинга
Кратчайшая история времени

И можно еще посмотреть, тоже ок
Во Вселенную со Стивеном Хокингом
Космос: Пространство и время
Сквозь червоточину с Морганом Фрименом
Достоевский очень любил использовать семиколоны.
Надо делать 2 нормативных акта. Один, для случаев, когда царь присутствует, другой, когда он отсутствует.
Можно было бы рейтинг на imdb указывать рядом.
Решить проблему «беспорядочного кликанья» и «пустой траты времени» путем создания другой проблемы — странный прием.

Всё — яд, всё — лекарство; то и другое определяет доза (с)
Например, если собеседник не женат, спросить почему.

Ну, точно, а у него тьфутьфу жена умерда, давайте наполмним ему об этом.

Профессиональные качества — это профессиональные, а личные — это личные.
1

Информация

В рейтинге
Не участвует
Откуда
Россия
Дата рождения
Зарегистрирован
Активность